索引是資料庫高效存取的核心資料結構,隨資料量增長效能差距呈指數級擴大。本文系統梳理索引優缺點、適用場景、建立方法、類型選擇,助你做正確決策。
| 代價 | 影響 | 量級估算 | |
|---|---|---|---|
| 寫入效能下降 | INSERT/UPDATE/DELETE 需同步維護所有索引 | 每索引約 +10-20% 寫入延遲 | |
| 儲存空間佔用 | 每索引獨立 B+Tree,聚簇索引含完整行資料 | 非聚簇索引約 10-30% 表大小 | |
| 維護開銷增大 | 統計資訊更新、碎片整理、檢查點刷盤 | 大表 OPTIMIZE 可能耗時小時級 |
| 類型 | 語法關鍵字 | 特點 | 適用場景 |
|---|---|---|---|
| 主鍵索引 | PRIMARY KEY | 唯一、非空、聚簇索引(InnoDB) | 每表必須有,推薦自增整數 |
| 唯一索引 | UNIQUE / UNIQUE KEY | 值唯一、允許一個 NULL | 業務唯一鍵:身份證、郵箱、手機 |
| 普通索引 | INDEX / KEY | 允許重複、允許 NULL | 一般查詢條件、排序、分組列 |
| 全文索引 | FULLTEXT | 支援自然語言/布林模式搜尋 | 文章、評論、日誌全文檢索(5.6+ InnoDB 支援) |
| 複合/聚簇索引 | INDEX(a,b,c) | 多列組合,遵循最左前綴 | 多條件組合查詢、覆蓋索引 |
| 空間索引 | SPATIAL | 地理空間資料類型 | GIS 應用、位置服務 |
-- 刪除主鍵並重建複合主鍵
ALTER TABLE t DROP PRIMARY KEY, ADD PRIMARY KEY (col_a, col_b);
SHOW INDEX FROM t;
-- 或
SHOW KEYS FROM t;
INDEX(where_col, select_col1, select_col2) 避免回表pt-index-usage 分析未用索引,pt-duplicate-key-checker 檢測重複索引索引是把雙面刃,用得好是效能倍增器,用不好是寫入殺手。沒有最好的索引,只有最適合當前業務讀寫模式的索引。