1. 必須創建索引,但拒絕過度索引
- 查詢主導型應用索引至關重要,缺失導致全表掃描
- 低基數欄位(如性別、狀態)建索引收益低,反拖慢寫入
2. 善用複合索引,遵循最左前綴原則
-- 查詢:WHERE area='beijing' AND age=22
-- 單列索引:每次只能用一個
-- 複合索引:(area, age) 效率最高
-- 創建 (area, age, salary) 等效於擁有:
-- (area, age, salary)、(area, age)、(area) 三個索引
-- 最常用條件列放最左,依次遞減
3. 索引不包含 NULL 值
- 含
NULL 的列不會進入索引
- 複合索引任一列為
NULL 導致該列對複合索引失效
- 設計時避免預設值為
NULL,改用 NOT NULL DEFAULT '' 或 0
4. 使用短索引(前綴索引)
CHAR(255) 列若前 10-20 字符區分度高,僅索引前綴:INDEX idx_name (col(10))
- 提升查詢速度、節省磁碟空間與 I/O
5. 排序與索引的關係
- MySQL 單查詢只用一個索引
WHERE 用了索引,ORDER BY 列不會再用索引
- 避免多列排序,必要時建複合索引覆蓋
WHERE + ORDER BY
6. LIKE 模糊查詢優化
LIKE '%aaa%':不走索引
LIKE 'aaa%':可走索引
- 非必要勿用
LIKE,考慮全文索引或搜尋引擎
7. 避免在索引列上進行運算/函數
-- 錯誤:導致索引失效、全表掃描
SELECT * FROM users WHERE YEAR(adddate) < 2007;
-- 正確:改為範圍查詢
SELECT * FROM users WHERE adddate < '2007-01-01';
8. 拒絕 NOT IN 和 <> 操作
- 均不走索引,全表掃描
NOT IN → NOT EXISTS 或 LEFT JOIN ... IS NULL
id <> 3 → id > 3 OR id < 3