1. exists 和in 的區別
當外查詢的數據大時,子查詢中的記錄較少時,用in;先查詢子句,然後把外表一條條的與已得到的查詢結果匹配,這個時候子查詢還會重新運行一遍;
當子查詢的記錄較多,外查詢的數據較少時,用exists;先對外表做loop循環, 把外表的每一行與子表的查詢去匹配,相當於兩個嵌套的for循環,得到了正確結果之後就返回相當於break;。
exists對外表做loop循環,in把內表外表做hash連接;
2. 儘量少使用* ,*號掃描所有字段
3. 儘量少使用%like,%在最前面會進行全局掃描;
4. having 和 where
having 和where 都是增加查詢條件;
having 一般用於對於分組後 的語句查詢,where是普通的條件;
where只能對一條數據設置條件,而having是針對的一組;一般是先where過濾然後在使用having;
5. 儘量使用多表連接,避免子查詢
6.儘量在where後面 少用!= < >,這樣引擎放棄索引 進行全局掃描 ;
避免在where子句中進行函數操作;
7. from where 的子句執行順序都是從右往左,從下往上,所以
from 將表數據少的放後面,where條件篩選掉數據多的放後面,groupby 從左往右,放在where後面,
having 消耗資源較大,他是在檢出所有資源之後再使用的, 所以儘量少用,他是對最後的結果排序,或者對組添加條件;
8.