MySQL 索引類型深度解析:INDEX、PRIMARY、UNIQUE、FULLTEXT 差異比較
整理自 StackOverflow 高票回答,系統比較 MySQL 四大索引類型的定義、約束差異、適用場景與內部實作機制。
核心差異比較表
| 索引類型 | 別名 | 唯一性約束 | 空值允許 | 每表數量 | 主要用途 |
| INDEX / KEY | 普通索引 | 無 | 允許 | 多個 | 加速查詢,無資料約束 |
| UNIQUE | 唯一索引 | 強制唯一 | 允許 (多個 NULL 視為不相等) | 多個 | 業務鍵唯一性 + 查詢加速 |
| PRIMARY | 主鍵索引 | 強制唯一 + NOT NULL | 不允許 | 僅一個 | 實體識別鍵,InnoDB 叢集索引基礎 |
| FULLTEXT | 全文索引 | 不適用 | 允許 | 多個 | 全文搜尋 (MATCH...AGAINST) |
詳細特性說明
INDEX (普通索引)
- 不強制任何資料約束,純為查詢效能
- 允許重複值與 NULL 值
- 底層通常為 B+ Tree
UNIQUE (唯一索引)
- 所有索引欄位組合必須唯一 (非單欄唯一)
- 可包含 NULL,多筆 NULL 視為不違反唯一性 (NULL ≠ NULL)
- 插入/更新時資料庫自動檢查,違反則報錯
- 若需禁止 NULL,請額外加
NOT NULL 約束
PRIMARY (主鍵索引)
- 語義上是表的「主識別鍵」
- 隱含
UNIQUE + NOT NULL
- 每表僅能有一個,慣例命名為
PRIMARY
- InnoDB 中主鍵即叢集索引,資料按主鍵物理排序儲存
- 建議使用單欄自增整數或業務上天然唯一且短小的欄位
FULLTEXT (全文索引)
- 專門支援
MATCH(col) AGAINST('keyword') 全文搜尋
- 不支援一般比較運算子 (=, >, LIKE 等)
- MySQL 5.6+ InnoDB 支援,早期僅 MyISAM
- 僅適用於
CHAR、VARCHAR、TEXT 類型
- 建立時會產生額外系統表、獨立快取機制,開銷較大
共同特性
- 皆可為複合索引 (多欄位)
- 除 FULLTEXT 外,欄位順序極重要:查詢必須從最左欄位開始匹配 (最左前綴原則)
- FULLTEXT 查詢需包含索引中所有欄位才生效
實務選擇指南
- 業務主鍵 → PRIMARY KEY
- 業務唯一鍵 (如 Email、身分證) → UNIQUE
- 頻繁查詢/聯結/排序欄位 → INDEX
- 大文本欄位需關鍵字搜尋 → FULLTEXT
- 複合索引設計遵循:高選擇性、高頻率、小寬度欄位優先靠左
補充:二級索引隱含主鍵值
InnoDB 二級索引葉節點存儲主鍵值而非物理位址,「回表」查詢時先查二級索引得主鍵,再查叢集索引得完整行。這意味著:
- 主鍵越短,二級索引越小,效能越好
- 覆蓋索引可避免回表,大幅提升查詢速度