單列含 NULL 不入索引;組合索引任一列含 NULL 導致該列對組合索引無效。建議:字段默認 NOT NULL。
CHAR(255) 列若前 10-20 字符區分度高,僅索引前綴:INDEX(name(10))。節省空間、提升 I/O 效率。
MySQL 單查詢僅用一個索引。WHERE 已用索引時,ORDER BY 列不再用索引。建議:默認排序滿足需求時避免排序;多列排序建立組合索引。
LIKE 'aaa%' → 可用索引LIKE '%aaa%' → 全表掃描,索引失效-- 錯誤:全表掃描
SELECT * FROM users WHERE YEAR(adddate) < 2007;
-- 正確:索引生效
SELECT * FROM users WHERE adddate < '2007-01-01';
同理避免 NOT IN、<> 等導致索引失效的操作。
純加速查詢,選擇區分度高、緊湊的列(如整數)。
約束數據唯一性,簡化 MySQL 管理,插入時自動檢查重複。
關鍵字 PRIMARY 而非 UNIQUE,表僅能有一個主鍵。
定義外鍵約束時 MySQL 自動創建內部索引輔助管理。
遵循最左前綴原則:可作為 a、(a,b)、(a,b,c) 索引使用,但不可用於 b、c、 (b,c)。
適用大文本字段模糊搜尋,MATCH(col) AGAINST('word') 語法。注意:InnoDB 5.6+ 才支援,早期版本僅 MyISAM。
InnoDB 行級鎖基於索引實現。無合適索引時,行鎖退化為表鎖,嚴重影響並發。SELECT ... LOCK IN SHARE MODE、FOR UPDATE、DML 操作均依賴索引加鎖。
關鍵列解讀:
type:system > const > eq_ref > ref > range > index > ALL(越前越好)key_len:越小越好(如 INT 為 4 字節)rows:預估掃描行數,乘積反映總掃描量Extra:Using temporary、Using filesort 為優化信號索引是雙刃劍:加速讀、拖慢寫、佔空間。遵循「只為高頻查詢/排序列建索引、組合索引遵循最左前綴、避免列運算、善用 EXPLAIN」原則,定期審視索引效果,刪除無效索引。