索引是查詢效能的關鍵,但「索引越多越好」是危險誤區。掌握六大設計原則,打造高效能資料庫。
最適合建索引的欄位出現在 WHERE 條件、JOIN ON 關聯條件、ORDER BY/GROUP BY 子句中,而非 SELECT 選取清單。查詢優化器根據條件列選擇索引,選取列只影響回表成本。
基數 = 不重複值數量 / 總行數。身分證號、手機號、UUID 基數接近 1,索引效果極佳;性別、狀態、布林旗標 基數極低 (約 0.5/0.01),建索引幾無幫助,甚至拖慢寫入。
長字串欄位 (如 VARCHAR(200)) 建立前綴索引:INDEX idx_name (name(10))。若前 10-20 字元區分度已高,無需索引全欄位。優勢:
注意:過短前綴 (如 1 字元) 區分度太低,失去索引意義。
建立 INDEX idx_a_b_c (a, b, c) 實際可用於:
WHERE a = ?WHERE a = ? AND b = ?WHERE a = ? AND b = ? AND c = ?ORDER BY a, b, c但 WHERE b = ? 或 WHERE a = ? AND c = ? (跳過 b) **無法用到索引**。設計複合索引時,將區分度最高、最常用於等值查詢的列放最左。
每個索引皆須維護:
INSERT/UPDATE/DELETE 需同步更新所有索引,寫入延遲隨索引數線性增長原則:只保留必要索引。新增索引前問:是否為現有複合索引的最左列?是 → 不需新增。否 → 評估查詢頻率與寫入代價。
索引支援:=, >, >=, <, <=, BETWEEN, IN, LIKE 'prefix%'。
不支援:LIKE '%suffix'、LIKE '%mid%'、STRCMP()、函數運算 WHERE YEAR(date) = 2024 (需用函數索引或生成列)。
| 場景 | 建議索引策略 |
|---|---|
| 單表多條件查詢 | 複合索引,等值列在前、範圍列在後 |
| JOIN 關聯查詢 | 驅動表關聯欄位建索引,被驅動表關聯欄位必建索引 |
| 排序/分組 | 索引列順序匹配 ORDER BY/GROUP BY 順序 |
| 覆蓋索引 | SELECT 欄位全部包含在索引中,避免回表 |
| 長文本搜尋 | 全文索引 (FULLTEXT) 或外部搜尋引擎 (Elasticsearch) |