索引是查詢性能的加速器,也是寫入性能的成本中心。本文系統梳理 MySQL 六大索引類型(普通、唯一、主鍵、外鍵、復合、全文)的特點、適用場景、優缺點,並給出基於業務特徵的選型決策樹與生產環境避坑清單。
| 類型 | 關鍵字 | 唯一性 | 空值 | 數量限制 | 核心用途 | 優點 | 缺點 |
|---|---|---|---|---|---|---|---|
| 主鍵索引 | PRIMARY KEY | 強制唯一 | 不允許 NULL | 一表僅一個 | 行唯一標識、聚簇索引基礎 | 查找最快、天然有序、無回表 | 插入需有序、修改極難 |
| 唯一索引 | UNIQUE KEY | 強制唯一 | 允許多個 NULL | 可多個 | 業務唯一性約束(手機、郵箱、身份證) | 兼具約束與查詢加速 | 寫入檢查開銷、空值語義特殊 |
| 普通索引 | KEY / INDEX | 允許重複 | 允許 NULL | 可多個 | 高頻查詢條件、排序、分組列 | 靈活、無約束副作用 | 無業務語義保障 |
| 外鍵索引 | FOREIGN KEY | 引用唯一列 | 允許 NULL | 可多個 | 引用完整性約束 | 自動維護關聯一致性 | 嚴重影響寫入性能、鎖競爭、不建議生產用 |
| 復合索引 | INDEX(a,b,c) | 視定義而定 | 視定義而定 | 可多個 | 多列聯合查詢、排序、分組 | 單索引服務多查詢模式、最左前綴原理 | 列順序敏感、非最左列無法利用 |
| 全文索引 | FULLTEXT | 不適用 | 允許 NULL | 可多個 | 自然語言全文搜索 (MATCH...AGAINST) | 解決 LIKE '%word%' 全表掃描 | 5.7+ InnoDB 支援、中文需分詞插件、維護成本高 |
-- 創建
ALTER TABLE `articles` ADD FULLTEXT(`title`, `content`);
-- 查詢:自然語言模式
SELECT * FROM `articles`
WHERE MATCH(`title`, `content`) AGAINST('MySQL 性能優化' IN NATURAL LANGUAGE MODE);
-- 查詢:布爾模式(支援 + - * 運算符)
SELECT * FROM `articles`
WHERE MATCH(`title`, `content`) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
⚠️ **中文分詞**:內置 ngram parser(按 bigram 切分),精度一般。生產建議接入 Elasticsearch 或使用 `parser ngram` 配合自定義詞典。