分析所有 SQL,出現在 WHERE、JOIN ON、ORDER BY、GROUP BY 中頻率最高的欄位優先建立索引。
選擇性 = COUNT(DISTINCT column) / COUNT(*)。越接近 1 越適合建立索引(如身分證字號、手機號、UUID)。
經常同時出現的欄位組合(如 WHERE a=1 AND b=2、WHERE a=1 ORDER BY b)建立複合索引,遵循最左前綴原則。
如 status IN (0,1,2)、gender IN ('M','F')。索引掃描會導致大量隨機 IO,反而比全表掃描慢。
每次 UPDATE 都需維護索引結構。若「查詢:更新」比例低於 10:1,建議不建索引。
僅出現在 SELECT 清單中的欄位無需索引(覆蓋索引除外)。
全表掃描成本極低,索引維護成本反而更高。
=, >, >=, <, <=, IS NULL, BETWEEN, INLIKE 'prefix%'(不以萬用字元開頭)MAX()/MIN() 配合 WHERE 條件ORDER BY/GROUP BY 符合最左前綴LIKE '%keyword%'(前導萬用字元)WHERE varchar_col = 123(需加引號)WHERE DATE(created_at) = '2023-01-01'(應改用範圍查詢)OR 條件兩側索引不一致EXPLAIN SELECT ... 檢查 type(目標:ref, range, eq_ref)、key、rowsSET profiling=1; SELECT ...; SHOW PROFILES;SHOW INDEX FROM table 檢查基數mysqlslap 或 sysbench 壓測驗證innodb_buffer_pool_size 容納熱點索引(建議 70-80% 實體記憶體)ANALYZE TABLE 更新統計資訊INDEX(a) + INDEX(a,b))pt-duplicate-key-checker 檢測重複/冗餘索引