1. 聯合索引第一個字段就用范圍查找不會走索引供炎,mysql內部可能覺得第一個字段就用范圍规揪,結果集應該很大泳姐,回表效率不高,還不 如就全表掃描 范圍查找需謹慎
雖然使用( force index)了強制走索引讓聯合索引第一個字段范圍查找也走索引匆篓,掃描的行rows看上去也少了點浑度,但是最終查找效率不一定比全表 掃描高,因為回表效率不高
加上其他索引條件 使用覆蓋索引依然能夠對sql使用效率進行優(yōu)化
2. in和or在表數據量比較大的情況會走索引鸦概,在表記錄不多的情況下會選擇全表掃描
3.like KK% 一般情況都會走索引
索引下推(Index Condition Pushdown箩张,ICP), like KK%其實就是用到了索引下推優(yōu)化 什么是索引下推了? 對于輔助的聯合索引(name,age,position)窗市,正常情況按照最左前綴原則先慷,SELECT * FROM employees WHERE name like 'LiLei%' AND age = 22 AND position ='manager' 這種情況只會走name字段索引,因為根據name字段過濾完咨察,得到的索引行里的age和 position是無序的论熙,無法很好的利用索引。 在MySQL5.6之前的版本摄狱,這個查詢只能在聯合索引里匹配到名字是 'LiLei' 開頭的索引脓诡,然后拿這些索引對應的主鍵逐個回表,到主鍵索 引上找出相應的記錄二蓝,再比對age和position這兩個字段的值是否符合誉券。 MySQL 5.6引入了索引下推優(yōu)化指厌,可以在索引遍歷過程中刊愚,對索引中包含的所有字段先做判斷,過濾掉不符合條件的記錄之后再回表踩验,可 以有效的減少回表次數鸥诽。使用了索引下推優(yōu)化后,上面那個查詢在聯合索引里匹配到名字是 '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限定了啄巧。
回表