MySQL優化-where子句優化
本文討論where子句的優化. 本例中的優化是在select中實現,同樣可以應用與Delete,Update子句. 你可能嘗試重新編寫查詢來提高演算法效能,但會犧牲可讀性.MySql自動做同樣的優化,你可以減少這個工作,而保留sql語句更可讀和可維護,MySql會執行如下優化: 1 移去不需要的()
((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
2 常量替換
(a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5
3 常量條件刪除
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
4 使用索引的常量表達式只用一次.
5 使用count(*)返回簡單基於MyISAM和MEMORY表的資訊, 也可以使用not null表示式實現.
6 先一步檢查無效的常量表達式,MySql快速檢測這個語句,並返回none值.
7 假如你不使用group by或聚合函式(count(),min()…) ,having子句功能被where子句合併
8 使用Join 連線的表的查詢,簡單的where 子句會使運算更快捷.
9 查詢中,常量表會被優先讀取. 常量表: 空的表,或只有一行的表 where子句表示式,使用主鍵,或唯一索引進行比較,且是not null.
SELECT * FROM t WHERE primary_key=1;
SELECT * FROM t1,t2
WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
10 最好的join聯合. 在同一表中使用Group by 或 Order by子句 ,會優先被讀取.
11 假如Group by 和 Order by 使用不同的表,或Group,order 子句來自於第一個表之外的表,那麼會首先建立一個臨時表.
12 假如使用SQL_SMALL_RESULT修飾,MySQL會使用記憶體中臨時表
13 每個表的索引並不可靠,除非這個索引是經過優化的 ,才會更高效. ,一個好的掃描一次應覆蓋30%的表,但是現在優化更復雜,表的大小,行數多少,io塊讀寫都會影響.
14 在結果輸出前,每個不匹配Having子句的行被忽略.
快速查詢的例子:
SELECT COUNT(*) FROM tbl_name;
SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
SELECT MAX(key_part2) FROM tbl_name
WHERE key_part1=constant;
SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... LIMIT 10;
SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;
當索引是數字的時候,MySql將使用索引樹
SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
SELECT COUNT(*) FROM tbl_name
WHERE key_part1=val1 AND key_part2=val2;
SELECT key_part2 FROM tbl_name GROUP BY key_part1;
以下查詢返回排序的結果,但沒有sort子句
SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... ;
SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ...