MySQL 支援 7 大索引類型,各有結構特性、寫入代價與查詢加速場景。本文系統對比優缺點、限制條件與選型指南。
| 類型 | 關鍵字 | 核心語義 | 適用引擎 |
|---|---|---|---|
| 普通索引 | KEY / INDEX | 純加速查詢,允許重複、NULL | 全部 |
| 唯一索引 | UNIQUE | 值唯一,允許多個 NULL | 全部 |
| 主鍵索引 | PRIMARY KEY | 唯一+非空,聚集索引(InnoDB) | 全部 |
| 外鍵索引 | FOREIGN KEY | 自動建立內部索引維護引用完整性 | InnoDB |
| 組合索引 | INDEX(a,b,c) | 多列,遵循最左前綴 | 全部 |
| 全文索引 | FULLTEXT | 分詞倒排,支援自然語言/布林模式 | MyISAM、InnoDB 5.6+ |
| 空間索引 | SPATIAL | R-Tree,GIS 幾何類型 | MyISAM、InnoDB 5.7+ |
WHERE/ORDER BYCHAR/VARCHAR 可指定前綴長度(如 INDEX(name(10)))ERROR 1062row_id,極度不推薦INDEX(a,b,c) 可作 a、(a,b) 索引用,**不可作 b、c、(b,c)**BLOB/TEXT **必須**指定前綴長度(≤ 255 字符)ALTER TABLE t ADD FULLTEXT(col1, col2)SELECT * FROM t WHERE MATCH(col1,col2) AGAINST('word1 word2')ngram parser)WHERE col != ... / NOT INWHERE FUNC(col) = ...(函數/表達式)LIKE '%abc' 通配符開頭ORDER BY 條件非索引列或跨表| 欄位 | 關鍵值(由優到劣) | 說明 |
|---|---|---|
| type | system > const > eq_ref > ref > range > index > ALL | ALL=全表掃描,需優化 |
| possible_keys | 候選索引 | 理論可用 |
| key | 實際使用索引 | NULL=未用索引 |
| key_len | 索引長度 | 越短越好 |
| rows | 預估掃描行數 | 乘積=總掃描量 |
| Extra | Using index / Using where / Using temporary / Using filesort | Using index=覆蓋索引 |
索引是雙面刃:查詢加速、寫入拖累。精準建立、定期審視、無用即刪。