联合索引(多列索引)

联合索引其实也是一棵B+树,相较于单列索引区别在于联合索引的键值数量不是1,而是大于等于2.

 

最左匹配原则

假定上图联合索引的为(a,b)。联合索引也是一棵B+树,不同的是B+树在对索引a排序的基础上,对索引b排序。所以数据按照(1,1),(1,2)......顺序排放。

 

对于selete * from table where a=XX and b=XX,显然是可以使用(a,b)联合索引的,

 

对于selete * from table where a=XX,也是可以使用(a,b)联合索引的。因为在这两种情况下,叶子节点中的数据都是有序的。

 

但是,对于b列的查询,selete * from table where b=XX。则不可以使用这棵B+树索引。可以发现叶子节点的b值为1,2,1,4,1,2。显然不是有序的,因此不能使用(a,b)联合索引。

 

By the way:selete * from table where b=XX and a=XX,也是可以使用到联合索引的,你可能会有疑问,这条语句并不符合最左匹配原则。这是由于查询优化器的存在,mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。所以,当然是我们能尽量的利用到索引时的查询顺序效率最高咯,所以mysql查询优化器会最终以这种顺序进行查询执行。

 

优化:在联合索引中将选择性最高的列放在索引最前面。

 

例如:在一个公司里以age 和gender为索引,显然age要放在前面,因为性别就两种选择男或女,选择性不如age。

posted @ 2020-03-25 16:54  BeeeenWei  阅读(513)  评论(0编辑  收藏  举报