| この記事の要点 |
|
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・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09