MYsql优化where子句
? ? ?該部分討論where子句的優化,不僅select之中,相同的優化同樣試用與delete 和update語句中的where子句;
? ? 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:indexes 常量表達式只被計算一次:
? ? ?5:沒有where 條件的 單表 Count(*)直接檢索Information_schema庫中的統計信息(對 myisam 和 memory表)。?
? ? ?6:更早的察覺無效的常量表達式。mysql快速發現select語句中不可能成立的where條件并且返回no rows;
? ? ?7: 如果沒有使用group by 或者聚合函數(count(),min().max()),having子句會被合并到where 子句中;
? ? ?8:做鏈接的每個table,一個快速的where子句構造原則是盡可能的跳過更多的行;
? ? ?9:查詢中,所有 constant table 都在其他表之前讀取,constant table 定義如下:
? ? ? ? ? ? ?1.1 : 一個空表或者只有一行數據的表;
? ? ? ? ? ? ?1.2: ? 一個以主鍵 或唯一索引為 where條件子句的表,并且所有的Index部分都是和常量表達式比較,不為null(unique index 可能包含多個null);
? ? ? ? ??
SELECT * FROM t WHERE primary_key=1; SELECT * FROM t1,t2WHERE t1.primary_key=1 AND t2.primary_key=t1.id;? ? ? 10: 通過嘗試所有可能性,找到最好的表join組合情況,如果order by子句和group by 子句中的所有列都來至同一張表,那么該表在join時優先read;
? ? ? 11:如果order by子句和 group by子句不同,或者order by Or group by 包含不在查詢隊列第一張表的中的列,那么會創建 temporary table;
? ? ? 12: 優化器如果認為使用index 會比表scan 更高效,則會選擇使用index,scan表會被使用,如果最好的index需要scan多于30%的表記錄,但是一個固定的比例不會確定使用table scan或者走index,優化器更加復雜,根據在額外的因數,eg:表的大小,行數,block快的大小;
? ? ? 13: 有些情況下,mysql 可以讀取Index 數據而不必回訪data file(base table)(索引覆蓋);
? ? ?下面的快速例子:
SELECT COUNT(*) FROM tbl_name;SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;SELECT MAX(key_part2) FROM tbl_nameWHERE key_part1=constant;SELECT ... FROM tbl_nameORDER BY key_part1,key_part2,... LIMIT 10; SELECT ... FROM tbl_nameORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10; 以下是mysql只查詢 index B-Tree,假設index 列值為數值型: SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;SELECT COUNT(*) FROM tbl_nameWHERE key_part1=val1 AND key_part2=val2;SELECT key_part2 FROM tbl_name GROUP BY key_part1;以下是用index來避免Filesort
SELECT ... FROM tbl_nameORDER BY key_part1,key_part2,... ;SELECT ... FROM tbl_nameORDER BY key_part1 DESC, key_part2 DESC, ... ;?
?
轉載于:https://www.cnblogs.com/onlysun/p/4516756.html
總結
以上是生活随笔為你收集整理的MYsql优化where子句的全部內容,希望文章能夠幫你解決所遇到的問題。