| この記事の要点 |
|
MySQL でインデックス一覧を確認する
MySQL でテーブルに作成されたインデックスを確認する方法は複数あります。用途に応じて使い分けるのがコツです。
| 用途 | コマンド |
|---|---|
| とにかく一覧を見たい | SHOW INDEX FROM テーブル名; |
| DDL を取得したい | SHOW CREATE TABLE テーブル名; |
| SQL でフィルタ / JOIN | SELECT ... FROM information_schema.STATISTICS |
| 未使用インデックスを探す | sys.schema_unused_indexes |
| クエリでの使用を確認 | EXPLAIN SELECT ... |
1. SHOW INDEX — 標準コマンド
-- 基本構文
SHOW INDEX FROM テーブル名;
-- 別 DB を指定
SHOW INDEX FROM mydb.users;
-- 別名 (どれも同じ動き)
SHOW INDEXES FROM users;
SHOW KEYS FROM users;
出力例:
+--------+------------+---------------+--------------+-------------+-----------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |
+--------+------------+---------------+--------------+-------------+-----------+-------------+
| users | 0 | PRIMARY | 1 | id | A | 10000 |
| users | 0 | uniq_email | 1 | email | A | 10000 |
| users | 1 | idx_name_age | 1 | name | A | 9500 |
| users | 1 | idx_name_age | 2 | age | A | 10000 |
+--------+------------+---------------+--------------+-------------+-----------+-------------+
主要カラムの意味
| カラム | 意味 |
|---|---|
| Key_name | インデックス名。PRIMARY が主キー |
| Non_unique | 0 = UNIQUE / 1 = 重複可 |
| Seq_in_index | 複合インデックスの何番目のカラムか |
| Column_name | 対象カラム名 |
| Collation | 並び順(A=ASC / D=DESC / NULL=未ソート) |
| Cardinality | 推定ユニーク値数。低いと選択性が悪い |
| Sub_part | プレフィックスインデックスのプレフィックス長 |
| Index_type | BTREE / HASH / FULLTEXT / SPATIAL |
| Visible | YES / NO(8.0+)。NO は実行計画で無視される |
2. SHOW CREATE TABLE — DDL 全体
カラム定義 + インデックス + 外部キーをまとめて確認したいときに。
SHOW CREATE TABLE users \G*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`name` varchar(50) NOT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_email` (`email`),
KEY `idx_name_age` (`name`, `age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. information_schema.STATISTICS
SQL でフィルタしたいときは information_schema.STATISTICS を SELECT します。
-- 特定テーブルのインデックス一覧
SELECT
INDEX_NAME,
COLUMN_NAME,
SEQ_IN_INDEX,
NON_UNIQUE,
INDEX_TYPE,
CARDINALITY
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
AND TABLE_NAME = 'users'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
-- DB 全体でユニーク制約だけ抽出
SELECT TABLE_NAME, INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'mydb' AND NON_UNIQUE = 0
GROUP BY TABLE_NAME, INDEX_NAME;
4. 未使用インデックスを探す (MySQL 5.7+)
本番環境で「使われていないインデックス」を探すのは sys スキーマが便利。Performance Schema が有効なら自動で集計されます。
-- 一度も使われていないインデックス
SELECT * FROM sys.schema_unused_indexes;
-- インデックス使用統計
SELECT * FROM sys.schema_index_statistics
WHERE table_schema = 'mydb'
ORDER BY rows_selected DESC;
5. EXPLAIN でクエリ実行計画を確認
「このクエリでこのインデックスが使われているか?」を見るには EXPLAIN。
EXPLAIN SELECT * FROM users WHERE name = 'tarou' AND age = 30;+----+-------------+-------+------+-------------------+--------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+-------------------+--------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | users | ref | idx_name_age | idx_name_age | 207 | const | 1 | Using index condition |
+----+-------------+-------+------+-------------------+--------------+---------+-------+------+-----------------------+
key 列がそのクエリで実際に使われたインデックス名。NULL なら全表スキャン。
FAQ
Q: PRIMARY KEY と UNIQUE の見分け方
A: SHOW INDEX で Key_name = 'PRIMARY' が主キー。それ以外で Non_unique = 0 が UNIQUE インデックス。
Q: インデックスのサイズを知りたい
A: information_schema.TABLES の INDEX_LENGTH 列でテーブルごとの合計サイズが取れる。個別は mysql.innodb_index_stats。
Q: Cardinality が NULL や極端に低い
A: 統計が古い。ANALYZE TABLE テーブル名; で更新できる。
子ページ
子ページはありません
同階層のページ
- 実行計画の出力
- テーブルに紐づくインデックスを確認する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38