简述下自己对这个原则的看法吧。
据 蝉沐风[1, 2] 大佬的文章(建议先看一下这两骗文章),可以看到其实联合索引就是在主键索引的B+ 树的基础上在加一个B+树,这第二颗树的叶子节点存储了联合索引字段对应的值和对应的id,这样可以方便的通过id进行索引,找到主键索引中完整的一条记录。
假设我们建立了一个索引 (phone, name)。
select * from test
where phone = 110 and name = 'Tom';
在通过phone = 110(假设phone是int) 或 phone = 110 进行精准查询时,先是根据phone查,phone相同了再根据name查,先查会得到某条或某几条记录,进而在主键索引中查询到完整记录。
select * from test
where phone > 110 and name = 'Tom';
那么在phone遇到范围查询时,就很可能在叶子节点处查询到几个页,拿到了大量的数据,那么接下来的name显然就没办法按照之前说的phone相同再查name了。因为这样做的效率就和全表扫描一样了,所以,在phone范围查询后,后面的字段name索性就不利用索引了,直接在phone过滤出的结果上扫描了。
这就是我个人对索引中最左前缀原则的理解,欢迎批评指正。
参考文献
[1],图解|12张图解释MySQL主键查询为什么这么快
[2],图解|这次,彻底理解MySQL的索引