索引是資料庫效能調校最常用的手段,能讓伺服器以遠超全表掃描的速度定位特定行。對於包含 MAX()、MIN()、ORDER BY 的查詢,效能提升尤為明顯。
JOIN、WHERE、ORDER BY 子句中的欄位避免對低基數欄位建索引,例如 ENUM 類型的「省份」欄位,重複值極多,索引不僅無效,反而增加寫入開銷。
可在 CREATE TABLE 時同步建立,亦可事後用 ALTER TABLE 或 CREATE INDEX 補充。
MySQL 3.23.23+ 支援 FULLTEXT 索引,僅限 MyISAM 引擎。大量資料匯入時,建議先匯入再建立全文索引,速度遠快於先建索引再匯入。
即使有索引,不當的 SQL 寫法也會導致索引失效。以下為關鍵優化原則:
避免 INT 比較 BIGINT;CHAR 與 VARCHAR 長度相同時可比較。
-- 失效:YEAR() 導致索引無法使用
SELECT * FROM orders WHERE YEAR(order_date) < 2001;
-- 高效:直接比較日期常數
SELECT * FROM orders WHERE order_date < '2001-01-01';
-- 數值運算同理
SELECT * FROM inventory WHERE amount/7 < 24; -- 失效
SELECT * FROM inventory WHERE amount < 24*7; -- 高效
-- 全表掃描
SELECT * FROM books WHERE name LIKE 'MySQL%';
-- 利用索引範圍查詢
SELECT * FROM books WHERE name >= 'MySQL' AND name < 'MySQM';
查詢中若發生自動型別轉換,索引同樣失效。確保比較雙方資料型別一致。