索引是資料庫效能調優的「核武器」。本文從 B+ 樹存儲原理出發,系統講解索引分類、單列與複合索引抉擇、最左前綴原理、列選擇策略、EXPLAIN 執行計劃分析及索引維護代價,並附贈實戰案例與避坑清單,助你從「會用索引」進階到「懂索引」。
MySQL 所有索引預設採用 B+ 樹結構。葉子節點儲存「索引鍵值 + 行指針」,非葉子節點僅儲存鍵值導航。查找流程:
數量級對比:1000 行表,索引查找僅需 1 次 I/O,全表掃描需 1000 次,效能差距百倍以上。
| 類型 | 關鍵字 | 特性 | 適用場景 |
|---|---|---|---|
| 普通索引 | INDEX / KEY | 無唯一限制,可重複值 | 高頻查詢欄位、外鍵關聯列 |
| 唯一索引 | UNIQUE INDEX | 值唯一,允許 NULL(多個 NULL 不衝突) | 業務鍵:身分證、手機、郵箱 |
| 主鍵 | PRIMARY KEY | 唯一 + NOT NULL,聚簇索引,唯一 | 表標識列,InnoDB 必須有 |
| 全文索引 | FULLTEXT | 支援自然語言/布爾模式搜尋 | 長文本搜尋,MySQL 5.6+ InnoDB 支援 |
| 空間索引 | SPATIAL | 地理空間數據類型專用 | GIS 應用,僅 MyISAM/InnoDB 5.7+ |
| 欄位 | 核心指標 | 優化方向 |
|---|---|---|
| type | system > const > eq_ref > ref > range > index > ALL | 避免 ALL(全表掃描),追求 ref/range 以上 |
| possible_keys | 理論可用索引 | 若為 NULL,無索引可用 |
| key | 實際使用索引 | 若為 NULL,未命中索引 |
| key_len | 索引使用長度 | 推斷複合索引用了幾列 |
| rows | 預估掃描行數 | 越小越好,理想為 1 |
| Extra | Using index / Using where / Using temporary / Using filesort | 避免 Temporary、Filesort |
ANALYZE TABLE 更新基數統計,確保優化器決策準確OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建索引INDEX idx_name(name(10))WHERE YEAR(create_time)=2023 → ✅ 改為範圍查詢WHERE phone=13800000000 → ✅ 統一字串比對索引設計是「業務理解 + 原理掌握 + 持續迭代」的動態平衡,而非一次性配置。建立「監控 → 分析 → 調整 → 驗證」閉環,方能駕馭龐大數據集下的查詢效能。