实验
因为看到很多大厂的面试题都喜欢问:表t,联合索引(a,b,c),select * from t where b = 1 and c = 2 and a = 3; 走索引吗?
我去做了一下实验,创建了一张表,用explain去看执行计划,发现还真的走:
我的表长这样:
难道这就说明MySQL早已不再遵循最左索引匹配原则了吗?
我觉得不是的,只是最左索引匹配原则应当被重新审视。
(a, b, c)联合索引,建立出来B+树动不了,就是一棵树,叶子结点先按照a排序,a相等按照b排序,b再相等按照c排序。
这个结构是建表的时候就已经固定了,如果你的查询条件里只有b和c,那打死都走不了这个联合索引。如图:(这里的index是全索引扫描,也可以看到rows=10,我这张表一共就10行)
如果你的查询条件里有a,那肯定是至少可以走一部分的,至于为什么查询条件不按照从左到右的顺序写,也能走索引, 这就是优化器的功劳了。
再来看看范围查询呢?
结论
美团的技术团队是这样说的:tech.meituan.com/2014/06/30/…
其实就是:查询条件里只要有最左边的字段,就一定能走索引(前提where中多个条件是and连接哈),where中多个and之间的顺序已经无所谓了,因为有优化器了。