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


版權聲明:本BLOG上原創文章未經本人許可,網絡媒體轉載請注明出處,謝謝! https://blog.csdn.net/u013164931/article/details/82386555

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

創建表

 
         
1
2
3
4
5
6
7
create  table  test(
int  ,
int ,
int ,
int ,
key  index_abc(a,b,c)
)engine=InnoDB  default  charset=utf8;
 
         

  

插入 10000 條數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP  PROCEDURE  IF EXISTS proc_initData;
DELIMITER $
CREATE  PROCEDURE  proc_initData()
BEGIN
DECLARE  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();
---------------------
作者:蘿卜頭LJW
來源:CSDN
原文:https://blog.csdn.net/u013164931/article/details/82386555
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

  


建立了聯合索引(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM