索引是關係型資料庫效能調校的核心關鍵。本文系統梳理 MySQL 索引的底層結構、主要類型、單列與多列索引的抉擇邏輯、最左前綴原理、索引選擇策略與 EXPLAIN 實戰分析,助您建立高效的索引體系。
MySQL 所有索引均以 B+ 樹 形式儲存。無索引時,查詢需掃描全表(全表掃描),資料量增長時效能呈線性下降;有索引時,MySQL 可直接定位目標行,百萬級資料查找速度可提升百倍以上。
運作機制: 索引葉節點儲存索引鍵值與指向資料檔案實際行的「指標」。查詢時先在索引樹中定位鍵值,再透過指標直接讀取資料行,避免掃描大量無關資料。
| 類型 | 特性 | 建立方式 |
|---|---|---|
| 普通索引 | 最基礎,無唯一性限制 | CREATE INDEX idx_name ON tbl(col)ALTER TABLE tbl ADD INDEX idx_name(col)CREATE TABLE tbl(..., INDEX idx_name(col)) |
| 唯一索引 | 鍵值不可重複,允許 NULL | CREATE UNIQUE INDEX ...ALTER TABLE ... ADD UNIQUE ...CREATE TABLE ... UNIQUE ... |
| 主鍵 | 特殊唯一索引,不可為 NULL,每表僅一個 | PRIMARY KEY (col) 於建表或 ALTER TABLE ... ADD PRIMARY KEY |
| 全文索引 | 支援 VARCHAR/TEXT 全文搜尋(MySQL 3.23.23+) |
FULLTEXT 類型,大量資料建議 ALTER TABLE 建立 |
以 people(firstname, lastname, age) 為例,查詢 WHERE firstname='Mike' AND lastname='Sullivan' AND age=17:
關鍵結論: MySQL 單次查詢僅能使用一個索引,多列索引的聯集過濾能力遠超單列索引。
多列索引 (a,b,c) 等同於同時擁有 (a,b,c)、(a,b)、(a) 三個索引。以下查詢可用索引:
WHERE a=1 AND b=2 AND c=3
WHERE a=1 AND b=2
WHERE a=1
以下無法使用該索引:
WHERE b=2
WHERE c=3
WHERE b=2 AND c=3
設計啟示: 多列索引欄位順序應依「區分度高→低」與「查詢頻率高→低」排列。
WHERE col = ...、col > ...、col BETWEEN ...、col IN (...)、col LIKE 'prefix%'(非通配符開頭)。ON t1.col = t2.col。SELECT 清單、ORDER BY(非聚簇索引)、LIKE '%suffix'、函數運算(ABS(col))、NOT IN、OR 等非 SARGable 條件的欄位。關鍵欄位解讀:
ref 為非唯一索引查找,ALL 為全表掃描(需優化)。Using where、Using index(覆蓋索引)、Using filesort(需優化)等提示。INSERT/UPDATE/DELETE 需同步維護索引,降低寫入吞吐。最佳實務: 只為高頻查詢、高區分度欄位建立索引;定期用 EXPLAIN 驗證;大表考慮分區或歸檔而非盲目加索引。
索引是大型資料庫效能的關鍵杠桿。理解 B+ 樹原理、掌握最左前綴、善用 EXPLAIN 分析、在「查詢加速」與「寫入開銷」間取得平衡,才能構建可擴展的高效能 MySQL 架構。