1.聯(lián)合索引第一個(gè)字段用范圍不會(huì)走索引。
2.強(qiáng)制走索引徊都,雖然使用了強(qiáng)制走索引讓聯(lián)合索引第一個(gè)字段范圍查找也走索引芦拿,掃描的行rows看上去也少了點(diǎn),但是最終查找效率不一定比全表掃描高悔耘,因?yàn)榛乇硇什桓摺?br>
3.覆蓋索引優(yōu)化
4.in和or在表數(shù)據(jù)量比較大的情況會(huì)走索引讲岁,在表記錄不多的情況下會(huì)選擇全表掃描
5.like KK% 一般情況都會(huì)走索引,like KK%使用了索引下推。什么是索引下推了缓艳?可以在索引遍歷過程中校摩,對(duì)索引中包含的所有字段先做判斷,過濾掉不符合條件的記錄之后再回表阶淘,可以有效的減少回表次數(shù)衙吩。使用了索引下推優(yōu)化后,上面那個(gè)查詢?cè)诼?lián)合索引里匹配到名字是 'LiLei' 開頭的索引之后溪窒,同時(shí)還會(huì)在索引里過濾age和position這兩個(gè)字段坤塞,拿著過濾完剩下的索引對(duì)應(yīng)的主鍵id再回表查整行數(shù)據(jù)。
優(yōu)化總結(jié):
1澈蚌、MySQL支持兩種方式的排序filesort和index摹芙,Using index是指MySQL掃描索引本身完成排序。index效率高宛瞄,filesort效率低浮禾。
2、order by滿足兩種情況會(huì)使用Using index坛悉。
- order by語句使用索引最左前列伐厌。
- 使用where子句與order by子句條件列組合滿足索引最左前列。
3裸影、盡量在索引列上完成排序挣轨,遵循索引建立(索引創(chuàng)建的順序)時(shí)的最左前綴法則。
4轩猩、如果order by的條件不在索引列上卷扮,就會(huì)產(chǎn)生Using filesort。
5均践、能用覆蓋索引盡量用覆蓋索引
6晤锹、group by與order by很類似,其實(shí)質(zhì)是先排序后分組彤委,遵照索引創(chuàng)建順序的最左前綴法則鞭铆。對(duì)于groupby的優(yōu)化如果不需要排序的可以加上order by null禁止排序。注意焦影,where高于having车遂,能寫在where中的限定條件就不要去having限定了。
索引設(shè)計(jì)原則
1斯辰、代碼先行舶担,索引后上
2、聯(lián)合索引盡量覆蓋條件
3彬呻、不要在小基數(shù)字段上建立索引
4衣陶、長(zhǎng)字符串我們可以采用前綴索引柄瑰,但會(huì)影響order by與group by。
5剪况、where與order by沖突時(shí)優(yōu)先where
6教沾、基于慢sql查詢做優(yōu)化
核心思想:盡量利用一兩個(gè)復(fù)雜的多字段聯(lián)合索引,抗下你80%以上的查詢拯欧,然后用一兩個(gè)輔助索引盡量抗下剩余的一些非典型查詢详囤,保證這種大數(shù)據(jù)量表的查詢盡可能多的都能充分利用索引,這樣就能保證你的查詢速度和性能了镐作!