mysql索引最左匹配原則的理解

我記得網易面試的時候問到了、阿里也面到了

創建表

create table test(
a int ,
b int,
c int,
d int,
key index_abc(a,b,c)
)engine=InnoDB default charset=utf8;

插入 10000 條數據

DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=10000 DO
    INSERT INTO test(a,b,c,d) VALUES(i,i,i,i);
    SET i = i+1;
END WHILE;
END $
CALL proc_initData();

建立了聯合索引(a,b,c)

驗證:

explain 指令詳解可以查看

https://www.cnblogs.com/gomysql/p/3720123.html

explain select * from test where a<10 ;

explain select * from test where a<10 and b <10;

explain select * from test where a<10 and b <10 and c<10;

能不能將 a,b出現順序換一下,a,b,c出現順序換一下

explain select * from test where b<10 and a <10;

explain select * from test where b<10 and a <10 and c<10;

不是最左匹配原則嗎?

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

重點來了

explain select * from test where b<10 and c <10;、

explain select * from test where a<10 and c <10;

爲什麼 b<10 and c <10,沒有用到索引?而 a<10 and c <10用到了?

當b+樹的數據項是複合的數據結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最後得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因爲建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪裏查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等於張三的數據都找到,然後再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。

參考

https://blog.csdn.net/qq_24690761/article/details/52787897

https://blog.csdn.net/SkySuperWL/article/details/52583579

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章