别被骗了,mysql中SQL中的or也是可以走索引的

今天,线上数据库发现一个慢SQL,内容如下:

image.png

创建索引如下:

image.png

用explain来看下sql的执行计划:

image.png

结果发现sql没有按照预期的索引第一个索引执行,此时的执行时间为0.77。原本希望通过第一个索引过滤一多半的数据,可是mysql的执行器没有选择第一个索引。

突然想起之前看到的帖子说,mysql中or语句会导致索引失效。如果按目前的状况确实这样,第一个索引确实可以过滤更多的数据,但是mysql的sql执行器确实没有选择走第一个索引。难道真的这样吗?有点不相信,我再想是不是因为没有建组合索引才导致他不走第一个索引,于是我将第一个索引建成del_flag,voucher_id和carry_over_voucher_id的组合索引。修改后索引如下:

image.png

再次查看sql的执行计划:

image.png

结果依旧。唉,死马当作活马医吧,把or条件连接的字段单独建立索引试下。索引修改如下:

image.png

查看sql的执行计划:

image.png

结果意外,sql不仅使用第一个索引也使用了最后一个索引,SQL的执行时间也有之前的0.77S提升到0.058S。

你可能感兴趣的:(别被骗了,mysql中SQL中的or也是可以走索引的)