掌握 SHOW INDEX(或 SHOW KEYS)輸出各列含義,是索引分析、優化與治理的基礎技能。本文逐列拆解官方輸出字段,並給出實戰解讀技巧。
SHOW INDEX FROM `tbl_name`;
SHOW KEYS FROM `tbl_name`;
| 列名 | 含義 | 實戰解讀要點 |
|---|---|---|
| Table | 表名 | 確認對象表 |
| Non_unique | 0=唯一索引/主鍵,1=普通索引 | 快速區分主鍵、唯一、普通索引 |
| Key_name | 索引名(主鍵固定為 PRIMARY) | 命名規範檢查:建議 idx_表名_字段名 |
| Seq_in_index | 索引內列序號(從 1 開始) | 聯合索引列順序驗證,最左前綴原則依賴此順序 |
| Column_name | 列名 | 確認覆蓋索引包含的列 |
| Collation | A=升序,NULL=無排序(如 Hash 索引) | B+ 樹索引固定為 A |
| Cardinality | 索引基數(唯一值估計數) | 核心指標:基數/行數 越接近 1 選擇性越高; 定期 ANALYZE TABLE 更新統計信息 |
| Sub_part | 前綴索引長度(字節),NULL=全列 | 長文本/Blob 必須指定前綴長度;檢查是否截斷導致選擇性下降 |
| Packed | 壓縮方式,NULL=無壓縮 | InnoDB 不壓縮索引,通常為 NULL |
| Null | YES=允許 NULL,NO=不允許 | 含 NULL 列的索引在某些場景下選擇性較低 |
| Index_type | BTREE / FULLTEXT / HASH / RTREE | InnoDB 僅支持 BTREE/FULLTEXT;確認引擎匹配 |
| Comment | 備註信息 | 如 disabled、parser 等額外屬性 |
-- 1. 查看某表所有索引基數與選擇性
SELECT
INDEX_NAME,
COLUMN_NAME,
CARDINALITY,
ROUND(CARDINALITY / (SELECT TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl_name'), 4) AS selectivity
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl_name'
ORDER BY SEQ_IN_INDEX;
-- 2. 找出未被使用的索引(需配合 sys.schema_unused_indexes 視圖,MySQL 5.7+)
SELECT * FROM sys.schema_unused_indexes WHERE object_schema=DATABASE();
ANALYZE TABLE 刷新。varchar(100) 前綴 10 字符應設 40。Non_unique=0、Null=NO。熟練讀懂 SHOW INDEX,能讓索引優化從「盲目試錯」變為「數據驅動決策」。