SHOW INDEX FROM tbl_name(或 SHOW KEYS)是檢視表索引結構的標準指令。輸出包含 13 個欄位,每個都蘊含關鍵資訊。本文逐欄詳細解讀,並附上索引建立/刪除速查,幫助你快速診斷索引健康度。
mysql> SHOW INDEX FROM t_order\G
*************************** 1. row ***************************
Table: t_order
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 1000000
Sub_part: NULL
Packed: NULL
Null: NO
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: t_order
Non_unique: 1
Key_name: idx_user_status
Seq_in_index: 1
Column_name: user_id
Collation: A
Cardinality: 50000
Sub_part: NULL
Packed: NULL
Null: NO
Index_type: BTREE
Comment:
*************************** 3. row ***************************
Table: t_order
Non_unique: 1
Key_name: idx_user_status
Seq_in_index: 2
Column_name: status
Collation: A
Cardinality: 1000000
Sub_part: NULL
Packed: NULL
Null: NO
Index_type: BTREE
Comment:
| 欄位 | 含義 | 關鍵判讀 |
|---|---|---|
| Table | 表名稱 | 確認正確表 |
| Non_unique | 0=唯一索引/主鍵,1=普通索引 | 檢查唯一約束是否生效 |
| Key_name | 索引名稱(主鍵固定為 PRIMARY) | 命名規範:idx_前綴普通、uk_前綴唯一 |
| Seq_in_index | 索引內欄位順序(1 起) | 驗證聯合索引欄位順序是否符合最左前綴 |
| Column_name | 欄位名稱 | 核對欄位拼寫 |
| Collation | A=升序,NULL=無排序(Hash 索引) | B+Tree 固定為 A |
| Cardinality | 不重複值估算(基數) | 核心指標:越大選擇性越高,優化器越傾向用索引。需定期 ANALYZE TABLE 更新 |
| Sub_part | 前綴索引長度(位元組),NULL=全欄位 | VARCHAR(100) 索引前 10 字符 → Sub_part=10(utf8mb4 實際 30-40 bytes) |
| Packed | 關鍵字壓縮方式,NULL=無 | MyISAM 專屬,InnoDB 不壓縮 |
| Null | YES=允許 NULL,NO=不允許 | 主鍵/唯一索引欄位應為 NO |
| Index_type | BTREE, FULLTEXT, HASH, RTREE | InnoDB 僅 BTREE/FULLTEXT/SPATIAL |
| Comment | 備註(如 index comment、parser 名稱) | 輔助文檔 |
ALTER TABLE ADD INDEX。ANALYZE TABLE 更新統計。idx_a + idx_a_b,前者可刪。sys.schema_unused_indexes (MySQL 5.7+ sys schema) 發現。
-- ALTER TABLE(可批次)
ALTER TABLE t ADD INDEX idx_a (a);
ALTER TABLE t ADD UNIQUE uk_b (b);
ALTER TABLE t ADD PRIMARY KEY (id);
-- CREATE INDEX
CREATE INDEX idx_c ON t (c);
CREATE UNIQUE INDEX uk_d ON t (d);
ALTER TABLE t DROP INDEX idx_a;
ALTER TABLE t DROP PRIMARY KEY;
DROP INDEX idx_a ON t;
SHOW INDEX 輸出是索引健康檢查的「驗血報告」。重點關注 **Cardinality(選擇性)、Seq_in_index(最左前綴)、Sub_part(前綴長度)、Non_unique(唯一性)**。定期 ANALYZE TABLE 更新統計,配合 sys.schema_unused_indexes 清理冗餘,保持索引精簡高效。