Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL 登録されている索引の一覧を出力する

MySQLにて、登録されている索引を確認する方法としては

mysql > show index from TABLE_NAME;

で確認できます。しかしこれですと全てのスキーマ内に存在する全ての索引を確認することができません では、索引が設定されているかいないかわからないテーブルの索引のみを探したすのはどう すすれば良いのか?

information_schema.STATISTICS テーブルを確認することですべてのテーブルに設定されている索引を確認することができます

話は変わりますが

IBM DB2では、システム系のスキーマを、SYSCAT スキーマで管理しております。SYSCATスキーマは、 読んで字のごとくシステムカタログ系のスキーマです。(厳密には、SYSIBMスキーマのVIEW) このようなものを、MySQLではどこで管理しているのか?ですが、INFORMATION_SCHEMAという スキーマで管理しております。

IBM DB2の索引情報ってすっごく見やすくて、以下のようなSQLを投げるだけで登録している索引の一覧を出力することができます。

IBM DB2で登録されている、索引の一覧を表示するSQL

SELECT 
  TABSCHEMA,
  TABNAME,
  INDNAME,
  UNIQUERULE,
  COLNAMES 
FROM 
  SYSCAT.INDEXES
ORDER BY
   TABLE_SCHEMA,
   TABLE_NAME,
   INDEX_NAME;

以下MySQLでの索引一覧をIBMのSYSCAT.INDEXESのように表示するSQLです

SELECT 
 X.TABLE_SCHEMA AS TABSCHEMA,
 X.TABLE_NAME AS TABNAME,
 X.INDEX_NAME AS INDNAME,
 X.UNIQUERULE AS UNIQUERULE,
 rtrim(group_concat(concat(X.COLLATION,X.COLUMN_NAME) order by X.SEQ_IN_INDEX asc SEPARATOR '')) as COLNAMES 
FROM
 (
  SELECT
    Y.TABLE_SCHEMA,
    Y.TABLE_NAME,
    Y.INDEX_NAME,
    case  Y.NON_UNIQUE
    WHEN 0 then
      IF (Y.INDEX_NAME = 'PRIMARY','P','U')
    else
      'D'
    end as UNIQUERULE,
    case 
    when Y.COLLATION = 'A' then '+'
    when Y.COLLATION = 'D' then '-'
    else '*' 
    end as COLLATION, 
    Y.COLUMN_NAME,
    Y.SEQ_IN_INDEX
    from
     (
      select * from information_schema.STATISTICS
     ) as Y
    where
    Y.TABLE_SCHEMA <> 'mysql'
    order by 
      Y.TABLE_SCHEMA,
      Y.TABLE_NAME,
      Y.INDEX_NAME,
      Y.SEQ_IN_INDEX
) as X
group by
   X.TABLE_SCHEMA,
   X.TABLE_NAME,
   X.INDEX_NAME,
   X.UNIQUERULE
order by
   X.TABLE_SCHEMA,
   X.TABLE_NAME,
   X.INDEX_NAME;
  • 上記SQLを実行した結果は以下の通りです(一部抜粋)
+-----------+-----------------------------+---------------------------+------------+------------------------------------| TABSCHEMA | TABNAME                     | INDNAME                   | UNIQUERULE | COLNAMES                           +-----------+-----------------------------+---------------------------+------------+-----------------------------------
| wp_squad  | events_rec                  | PRIMARY                   | P          | +event_id                                                                    |
| wp_squad  | test_users                  | PRIMARY                   | P          | +id                                                                          |
| wp_squad  | wp_commentmeta              | comment_id                | D          | +comment_id                                                                  |
| wp_squad  | wp_commentmeta              | meta_key                  | D          | +meta_key                                                                    |
| wp_squad  | wp_commentmeta              | PRIMARY                   | P          | +meta_id                                                                     |
| wp_squad  | wp_comments                 | comment_approved          | D          | +comment_approved                                                            |
| wp_squad  | wp_comments                 | comment_approved_date_gmt | D          | +comment_approved+comment_date_gmt                                           |
| wp_squad  | wp_comments                 | comment_date_gmt          | D          | +comment_date_gmt                                                            |
| wp_squad  | wp_comments                 | comment_parent            | D          | +comment_parent                                                              |
| wp_squad  | wp_comments                 | comment_post_ID           | D          | +comment_post_ID                                                             |
| wp_squad  | wp_comments                 | idx01_wp_comments         | D          | +comment_post_ID                                                             |
| wp_squad  | wp_comments                 | idx02_wp_comments         | D          | +comment_post_ID+comment_date_gmt                                            |
| wp_squad  | wp_comments                 | PRIMARY                   | P          | +comment_ID                                                                  |
| wp_squad  | wp_ktaisession              | PRIMARY                   | P          | +sid                                                                         |
| wp_squad  | wp_links                    | link_visible              | D          | +link_visible                                                                |
| wp_squad  | wp_links                    | PRIMARY                   | P          | +link_id                                                                     |
| wp_squad  | wp_options                  | idx01_wp_options          | D          | +autoload                                                                    |
| wp_squad  | wp_options                  | option_name               | U          | +option_name                                                                 |

これが、DB2のSYSCAT.INDEXESの出力結果とほぼ同様です。簡単に説明すると TABSCHEMA・・スキーマ名 TABNAME・・・テーブル名 IDNAME・・・インデクス名 UNIQUERULE・・ユニークか否か(P: プライマリ U:ユニーク D:非ユニーク) COLNAMES・・・索引に設定されているカラムです"+"が照準、"-"が降順です・・が、MySQLの索引は降順というインデクス の登録はできませんので、オマケです

以上、おためしあれ。