EXPLAIN 分析習慣大偏移量 COUNT 可用「總行數 - 小偏移量 COUNT」反向查詢。無 WHERE 時 COUNT(*) 直接讀取表統計資訊最快。
float/int、char/varchar、binary/varbinary 混用會阻礙優化器優化。
-- 差:WHERE F1/2=100 (全表掃描) -- 優:WHERE F1=100*2 (走索引)
導致無法使用索引。IN 可用 EXISTS 替代。
字串比較需逐字元,數字一次比較,效能差異顯著。
-- 差:WHERE (SELECT COUNT(*) FROM T2 WHERE T2.C2=T1.C2) > 0 -- 優:WHERE EXISTS (SELECT * FROM T2 WHERE T2.C2=T1.C2)
存在性檢查用 EXISTS 而非 COUNT(*)。
會導致表鎖定阻塞其他連線。
SELECT * FROM T1 (INDEX=IX_ProcessID) WHERE nextprocess=1 AND processid IN (8,32,45)
-- 差:WHERE (A=1 AND B>100) OR C=1008 (全表掃描) -- 優:WHERE A=1 AND B>100 UNION SELECT * WHERE C=1008 (走索引)
LIKE '%L%' / SUBSTRING(name,2,1)='L' → 全表掃描 LIKE 'L%' → 走索引
UNION ALL 不排序去重,大幅節省資源。跨庫查詢尤為明顯。
-- 差:LIMIT 50000, 5 -- 優:覆蓋索引偏移 + JOIN 回表 SELECT f.film_id, f.description FROM sakila.film f INNER JOIN (SELECT film_id FROM sakila.film ORDER BY title LIMIT 50000, 5) t USING (film_id);
INSERT INTO person(name,age) VALUES ('xboy',14), ('xgirl',15), ('nia',19);
ORDER BY col LIMIT N → 單欄索引 (col)WHERE x=1 ORDER BY col LIMIT N → 聯合索引 (x, col)WHERE x IN (...) ORDER BY col LIMIT N → 聯合索引效果有限,待優化WHERE uid=1 ORDER BY x,y LIMIT N → 最佳索引 (uid, x, y) 而非 (x, y, uid)優化非一次性工作,建立慢查詢審核機制、定期 ANALYZE TABLE 更新統計資訊、關注新版本優化器改進。