mysql的联合索引的误解

时间:2021-02-17 05:17:32

https://www.zhihu.com/question/36996520

之前对于联合索引有一个误区,

假设 name,age为一个联合索引

5条索引记录

a 10

b 5

c 12

c 15

d 2

当查找 where name='a' and age=10的时候能利用这个联合索引,为什么 where name>'a' and age=5 就只能使用到联合索引的部分索引,指第一个索引呢?

其实还是对联合索引的性质不熟悉,网上找了资料

mysql创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name字段的数据进行排序,在第一个字段的排序基础上(第一个字段都相同),然后再对后面第二个的cid字段进行排序。其实就相当于实现了类似 order by name cid这样一种排序规则。

由于是name>'a' 所以使用联合索引的第一个索引, 留下记录

b 5

c 12

c 15

d 2

针对第二列无法使用二分查找啊,

如果是name='c' and age=15 或 name='c' and age>15 没问题 name 为12的那两行记录 是有序的

这也就是mysql索引规则中要求复合索引要想使用第二个索引,必须先使用第一个索引的原因。(而且第一个索引必须是等值匹配)。