索引最左匹配原則


索引最左前綴匹配原則

介紹:在建立聯合索引時,都遵循從左往右的優先級,最左優先,當出現范圍查詢(> < between like等等)時停止匹配。

首先需要了解索引常用的數據結構,B+樹,網上資料眾多,不再贅述

參考鏈接:https://blog.csdn.net/jiang_wang01/article/details/113739230

表准備

現在建一個很簡單的表:

然后加入索引(基數都為5):

加入數據:

1-5都是按照數字順序, 而6-10加入了重復數據

SQL語句執行

1.無范圍查詢

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id = 1 AND order_no = 1 AND `age` = 1

索引三個字段都走了

2.有范圍查詢

范圍查詢在中間

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id = 1 AND order_no <3 AND `age` = 1

這是最左前綴匹配原則就出現了,age也就是第三個字段沒有走上索引,並且索引類型也變為了range(范圍索引)

范圍查詢在第一位

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id < 4 AND order_no =3 AND `age` = 1

結果依舊是依據最左前綴匹配原則

為什么會有最左前綴匹配原則

大概描述一下在B+樹結構下,最下面鏈表的順序:

  (1,1,1), (2,2,2), (3,3,3) --> (4,4,4), (5,5,5), (6,6,6) --> (7,6,6), (8,7,7), (9,6,6) --> (9,8,8)

括號里面分別就是(b_id, order_no, age)

 

可以發現,b_id作為第一位,順序始終都是正確的,而order_no作為第二位,在(8,7,7), (9,6,6)出現了順序錯誤,因為b_id優先排列,所以order_no出錯。

聰明的小伙伴其實應該聯想到了order by的實現

order by中最前優先排列,如果相同,再看第二位,如果第二位相同,再看第三位。

 

所以可以思考得出:

一:范圍查詢在第一位

WHERE b_id < 4 AND order_no =3 AND age = 1,b_id就已經把第一個范圍給找到了,不再需要order_no再走索引去找對應值了,而是在已經確定的范圍中查找即可。

二:范圍查詢在中間

WHERE b_id = 1 AND order_no <3 AND age = 1,b_id走索引找到了=1的數據,然后order_no走索引查到了范圍,那么age就在此范圍中查詢值即可。

 

歡迎各路大佬指正


免責聲明!

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



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