今天,线上数据库发现一个慢SQL,内容如下:
![](https://img.haomeiwen.com/i2361089/161c6fe7ca842c2e.png)
创建索引如下:
![](https://img.haomeiwen.com/i2361089/e5fd74eb01b1d6d6.png)
用explain来看下sql的执行计划:
![](https://img.haomeiwen.com/i2361089/2811dd7b09c892d2.png)
结果发现sql没有按照预期的索引第一个索引执行,此时的执行时间为0.77。原本希望通过第一个索引过滤一多半的数据,可是mysql的执行器没有选择第一个索引。
突然想起之前看到的帖子说,mysql中or语句会导致索引失效。如果按目前的状况确实这样,第一个索引确实可以过滤更多的数据,但是mysql的sql执行器确实没有选择走第一个索引。难道真的这样吗?有点不相信,我再想是不是因为没有建组合索引才导致他不走第一个索引,于是我将第一个索引建成del_flag,voucher_id和carry_over_voucher_id的组合索引。修改后索引如下:
![](https://img.haomeiwen.com/i2361089/7644e9337e1e3228.png)
再次查看sql的执行计划:
![](https://img.haomeiwen.com/i2361089/c5a9fb6f3ac1b5d4.png)
结果依旧。唉,死马当作活马医吧,把or条件连接的字段单独建立索引试下。索引修改如下:
![](https://img.haomeiwen.com/i2361089/b033afc4f5686dec.png)
查看sql的执行计划:
![](https://img.haomeiwen.com/i2361089/9275d3e3b5f8f211.png)
结果意外,sql不仅使用第一个索引也使用了最后一个索引,SQL的执行时间也有之前的0.77S提升到0.058S。
网友评论