写这篇文章是因为读到一篇关于联合索引在B+树上的存储结构和查找方式的文章
https://www.cnblogs.com/ibigboy/p/12373978.html
而做了一些相关的实验来验证猜想。
下面来进行sql语句实验:
1. select r.* from my_test r where r.a = '1' and r.b = '8' and r.c = 'a'; 该情景命中了索引
2.select r.* from my_test r where r.a = '1' and r.c = 'a'; 该情景下也命中索引
3.select r.* from my_test r where r.b = '8' and r.c = 'a'; 该情景下未命中索引
4.select r.* from my_test r where r.a = '1' and r.b = '8' ; 该情景下也命中索引
5.select r.* from my_test r where r.a = '1' ; 命中索引
6.select r.* from my_test r where r.b = '8' ; 未命中索引
7.select r.* from my_test r where r.c = 'a' ; 未命中索引
总结:通过以上几种场景,凡是违背了最左前缀匹配原则的都未命中索引,创建了(a,b,c)三列联合索引,相当于创建了(a,b,c)、(a,b)、(a)三个索引,联合索引是首先使用多列索引的第一列构建的索引树,所以会丛a列开始查找,a列相同再找b列,以此类推。综上所述,能否命中索引,要结合是否满足最左前缀匹配原则来看。