| 維度 | 類型 | 特點 |
|---|---|---|
| 資料結構 | B+ 樹 | 範圍查詢、排序、最左前綴,O(log n) |
| Hash | 僅 =/IN/<=>,O(1),Memory 引擎支援,無範圍查詢 | |
| Fulltext | 全文搜尋,MyISAM/InnoDB 5.6+ | |
| R-Tree | 空間資料 (GIS),SPATIAL 索引 | |
| 物理儲存 | 聚簇索引 | 主鍵即資料,InnoDB 預設 |
| 非聚簇索引 | 次級索引,葉子存主鍵值,回表查資料 | |
| 邏輯功能 | 主鍵索引 | 唯一、非空、單表僅一個 |
| 普通/單列索引 | 基本索引 | |
| 複合/多列索引 | 多欄位,遵循最左前綴 | |
| 唯一索引 | 值唯一,允許 NULL | |
| 空間索引 | GEOMETRY/POINT 等,MyISAM 專用 |
CREATE TABLE t(
col1 INT,
col2 VARCHAR(50),
INDEX idx_col1 (col1),
UNIQUE uk_col2 (col2),
INDEX idx_col1_col2 (col1, col2) -- 複合索引
);
-- 或
ALTER TABLE t ADD INDEX idx_col1 (col1);
CREATE INDEX idx_col1 ON t(col1);
WHERE/ORDER BY/GROUP BY/DISTINCT 高頻欄位建索引INDEX idx_name (name(18))(80% 資料 < 18 字元)MySQL 從左向右匹配,**遇到範圍查詢 (>、<、>=、<=、LIKE %...、BETWEEN) 停止匹配**。
-- 索引 (a,b,c,d)
WHERE a=1 AND b=2 AND c>3 AND d=4 -- 僅用到 a,b,c;d 無法用到
-- 索引 (a,b,d,c) → a,b,d,c 全用到
-- = 和 IN 可亂序,優化器自動重排
<、<=、=、>、>=、BETWEENLIKE 'prefix%'(不以萬用字元開頭)col IS NULL(已建索引)ORDER BY key2 配合 WHERE key1=? → 僅能用一個索引WHERE func(col)=?、WHERE col+1=? ❌;WHERE col=?+? ✅| 工具 | 原理 | 優點 | 缺點/風險 |
|---|---|---|---|
| mysqlidxchk | 分析 general/slow log | 離線分析 | 年久失修、風險大 |
| pt-index-usage | 分析 slow log | Percona 維護 | 需 long_query_time=0、大檔案分析慢、磁碟壓力大 |
| userstat (Google Patch) | 運行時統計 INDEX_STATISTICS | 效能影響極低 | Bug 導致 Crash,淘寶未敢上線 |
| check-unused-keys | 基於 userstat 腳本 | 直接輸出可刪索引 | 依賴 userstat 風險 |
建議:生產環境優先用 pt-index-usage 低峰期分析特定表,或人工結合 EXPLAIN、SHOW INDEX、業務知識判斷。