1. 聯(lián)合索引第一個字段就用范圍查找不會走索引,mysql內部可能覺得第一個字段就用范圍,結果集應該很大,回表效率不高,還不 如就全表掃描 范圍查找需謹慎
雖然使用( force index)了強制走索引讓聯(lián)合索引第一個字段范圍查找也走索引,掃描的行rows看上去也少了點,但是最終查找效率不一定比全表 掃描高,因為回表效率不高
加上其他索引條件 使用覆蓋索引依然能夠對sql使用效率進行優(yōu)化
2. in和or在表數據量比較大的情況會走索引,在表記錄不多的情況下會選擇全表掃描
3.like KK% 一般情況都會走索引
索引下推(Index Condition Pushdown,ICP), like KK%其實就是用到了索引下推優(yōu)化 什么是索引下推了? 對于輔助的聯(lián)合索引(name,age,position),正常情況按照最左前綴原則,SELECT * FROM employees WHERE name like 'LiLei%' AND age = 22 AND position ='manager' 這種情況只會走name字段索引,因為根據name字段過濾完,得到的索引行里的age和 position是無序的,無法很好的利用索引。 在MySQL5.6之前的版本,這個查詢只能在聯(lián)合索引里匹配到名字是 'LiLei' 開頭的索引,然后拿這些索引對應的主鍵逐個回表,到主鍵索 引上找出相應的記錄,再比對age和position這兩個字段的值是否符合。 MySQL 5.6引入了索引下推優(yōu)化,可以在索引遍歷過程中,對索引中包含的所有字段先做判斷,過濾掉不符合條件的記錄之后再回表,可 以有效的減少回表次數。使用了索引下推優(yōu)化后,上面那個查詢在聯(lián)合索引里匹配到名字是 'LiLei' 開頭的索引之后,同時還會在索引里過 濾age和position這兩個字段,拿著過濾完剩下的索引對應的主鍵id再回表查整行數據。 索引下推會減少回表次數,對于innodb引擎的表索引下推只能用于二級索引,innodb的主鍵索引(聚簇索引)樹葉子節(jié)點上保存的是全行數據,所以這個時候索引下推并不會起到減少查詢全行數據的效果。
4. 為什么范圍查找Mysql沒有用索引下推優(yōu)化? 估計應該是Mysql認為范圍查找過濾的結果集過大,like KK% 在絕大多數情況來看,過濾后的結果集比較小,所以這里Mysql選擇給 like KK% 用了索引下推優(yōu)化,當然這也不是絕對的,有時like KK% 也不一定就會走索引下推。
優(yōu)化總結: 1、MySQL支持兩種方式的排序filesort和index,Using index是指MySQL掃描索引本身完成排序。index 效率高,filesort效率低。 2、order by滿足兩種情況會使用Using index。 1) order by語句使用索引最左前列。 2) 使用where子句與order by子句條件列組合滿足索引最左前列。 3、盡量在索引列上完成排序,遵循索引建立(索引創(chuàng)建的順序)時的最左前綴法則。 4、如果order by的條件不在索引列上,就會產生Using filesort。 5、能用覆蓋索引盡量用覆蓋索引 6、group by與order by很類似,其實質是先排序后分組,遵照索引創(chuàng)建順序的最左前綴法則。對于group by的優(yōu)化如果不需要排序的可以加上order by null禁止排序。注意,where高于having,能寫在where中 的限定條件就不要去having限定了。
回表
