联合索引也是一颗B+树,只是键值的数量不是1
现创建(a,b)联合索引,则其索引树结构:
通过叶子节点读出所有数据,即为:(1,1)(1,2)(2,1)(2,4)(3,1)(3,2)
则a的值是有顺序的:1,1,2,2,3,3
b的值是无序的:1,2,1,4,1,2
但b相对于a是有序的,即a 固定的时候,b是有序的(也解释了索引的左匹配原则):
当a 为1时,b的顺序为:1,2
当a为2时,b的顺序为:1,4
。。。。。
所以:
select * from table where a ="1" and b = '2'; 可以使用(a,b)索引
select * from table where a > "1" and b = '2'; 没有使用(a,b)索引,只使用了a索引:
a的查询条件为范围查找,则得出的值中,b已经是无序的了,所以无法使用索引
这也解释了(>、<、between、like)查询会停止后面的索引匹配
table中添加索引(a)和联合索引(a,b)
select * from table where a =‘***’
理论上此sql有俩个索引可以使用,但优化器选择(a)索引,因为此索引的叶子节点包含的为单个键值,理论上一页存放数据更多
select * from table where a = '***' and b = '****'
select * from table where a = '***' order by b
select * from table where a ='***' order by b desc limit 4
上面的sql都会用到联合索引(a,b),,因为在a确定的情况下,联合索引(a,b)中b已经排好序了