最左匹配原则(重要)

上面我们按照name,address和phone这个顺序建立了复合索引,相当于建立了(name),(name、address)和(name、address、phone)三个索引,如果我们查询的where条件违背了建立的顺序,则复合索引就失效了,下面直接进行SQL分析:

EXPLAIN SELECT * FROM student WHERE name = '姓名_4' and phone = '7121877527' and address = '地址_4'

执行结果如图:

image.png

为什么明明违背了最左匹配原则,依旧还是走了复合索引呢?可能是如下原因:

1、通过索引过滤性能足够好,所以还是选择利用索引。

2、联合索引中前几个字段过滤效果较好,所以仍然选择利用索引。


可能的执行计划大概是:

1、优先通过phone字段过滤,将要扫描的记录减少一部分。

2、然后通过address字段继续过滤,再减少一部分记录。

3、最后通过name字段过滤,已经剩下很少的记录需要扫描。

4、尽管违反了最左匹配,解释器可能认为仍然利用索引效率比较高。

所以总的来说,就是解释器会根据实际情况进行权衡,即使是违反最左匹配原则,也可能会选择利用索引。但这并不是一个良好的查询优化,最好还是严格遵守最左匹配原则。


以下是严格遵守最左匹配原则的SQL:

SELECT * FROM student WHERE name = '姓名_4' 
SELECT * FROM student WHERE name = '姓名_4' and address = '地址_4' 
SELECT * FROM student WHERE name = '姓名_4' and address = '地址_4' and phone = '7121877527' 
腾讯云推出云产品限时特惠抢购活动:2C2G云服务器7.9元/月起
本文链接:https://www.jhelp.net/p/2Kbnpvt1GE90BNbx (转载请保留)。
关注下面的标签,发现更多相似文章