查詢為主的應用,索引至關重要。缺少索引導致全表掃描,大表下性能災難性下降。但非所有場景都需索引:如性別只有兩值,建索引不僅無優勢,還拖慢寫入(過度索引)。
單列索引查詢只能用一個;組合索引 (area, age, salary) 等價於 (area,age,salary)、(area,age)、(area) 三個索引。創建時將最常用篩選列放最左,依次遞減。
含 NULL 的列不會被納入索引;組合索引中任一列含 NULL,該列對組合索引無效。設計時避免字段默認值為 NULL。
CHAR(255) 列若前 10-20 字符區分度高,僅索引前綴長度。短索引提升查詢速度,同時節省磁盤空間與 I/O。
MySQL 單查詢只用一個索引。WHERE 已用索引時,ORDER BY 列不再使用索引。能用默認排序滿足時勿加排序;多列排序需建組合索引。
LIKE 'aaa%' ✅ 可用索引LIKE '%aaa%' ❌ 全表掃描-- ❌ 悲劇:每行計算 YEAR(),索引失效
SELECT * FROM users WHERE YEAR(adddate) < 2007;
-- ✅ 正確:直接比較日期常量,走索引
SELECT * FROM users WHERE adddate < '2007-01-01';
兩者均導致全表掃描。替代方案:NOT IN → NOT EXISTS;id <> 3 → id > 3 OR id < 3。
EXPLAIN 檢查執行計劃