首先需要了解索引常用的數據結構,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
歡迎各路大佬指正