1. 程式人生 > >MySQL優化-where子句優化

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, ...