天天看點

什麼是最左字首

最左字首原則:顧名思義是最左優先,以最左邊的為起點任何連續的索引都能比對上。

(1)如果第一個字段是範圍查詢需要單獨建一個索引;

(2)在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊;

當建立(a,b,c)複合索引時,想要索引生效的話,隻能使用 a和ab、ac和abc三種組合!

執行個體:以下是常見的幾個查詢:

mysql>SELECT `a`,`b`,`c` FROM A WHERE `a`='a1' ; //索引生效
mysql>SELECT `a`,`b`,`c` FROM A WHERE `b`='b2' AND `c`='c2'; //索引失效
mysql>SELECT `a`,`b`,`c` FROM A WHERE `a`='a3' AND `c`='c3'; //索引生效,實際上值使用了索引a
           

擴充:想要索引最大化的使用需要至少建幾個索引?

答:需要建立複合索引:bc

3.1、三個字段聯合索引測試:

什麼是最左字首

聯合索引的順序為:sex,age,name

SELECT * FROM user where sex="3"; #使用索引
SELECT * FROM user where age="4"; #未使用索引
SELECT * FROM user where name="2"; #未使用索引
SELECT * FROM user where sex="2" and age="3"; #使用索引
SELECT * FROM user where sex="2" and age="3" and name="4"; #使用索引
SELECT * FROM user where age="3" and name="4";  #未使用索引
SELECT * FROM user where sex="2" and name="4";  #使用索引

#這個在3.2最後邊解釋,為什麼
explain SELECT * FROM index_demo.user where age="2" and sex="3"; #使用索引
值得注意的是,where sex=“2” and name=“4” 這個相當于隻有sex使用到了索引的,
           
什麼是最左字首

和where sex=“2” and age=“3” and name="4"的差別:

什麼是最左字首

3.2、如果索引字段有兩個 如果索引有兩個字段:sex,age

什麼是最左字首
explain SELECT * FROM index_demo.user where sex="3"; #使用索引
explain SELECT * FROM index_demo.user where age="4"; #未使用索引
explain SELECT * FROM index_demo.user where sex="2" and age="3"; #使用索引
explain SELECT * FROM index_demo.user where age="3" and sex="4";  #使用索引
           
什麼是最左字首
什麼是最左字首

where sex=“2” and age=“3”;和where age=“3” and sex=“2”;

這兩個都是用了索引的,這是mysql查詢優化器,mysql查詢優化器會判斷糾正這條sql語句該以什麼樣的順序執行效率最高,最後才生成真正的執行計劃。是以,當然是我們能盡量的利用到索引時的查詢順序效率最高咯,是以mysql查詢優化器會最終以這種順序進行查詢執行。

然後回到剛才的3.1中三個索引的時候:sex,age,name

這條語句竟然使用索引了

什麼是最左字首

可以看出他是使用索引了,因為對于三個索引的時候,隻要是前兩個,存在,不論順序是什麼都是會使用索引的,這裡主要是mysql查詢優化器起的作用了;