mySql优化-timestamp不走索引及or不走索引优化

swx_order表和swx_order_provider表和swx_order_servicer表联查,where条件是last_modify_time,三张表的数据量都在40万以上,如下sql查询时间非常慢,而且主表(swx_order)时而走索引,时而不走索引,当last_modify_time时间区间很小时走索引,时间区间大之后就不走索引了,原因是如果加了索引的行数比较多,mysql的优化器会自动放弃索引而选择全表扫描

详细解释参考:https://dev.mysql.com/doc/refman/5.5/en/index-hints.html

mySql优化-timestamp不走索引及or不走索引优化_第1张图片

优化思路:强制sql执行时使用索引,也就是不需要mysql的优化器去选择,通过use index和force index可以强制sql任何时间都走索引,优化后如图所示:

mySql优化-timestamp不走索引及or不走索引优化_第2张图片

 

添加force index之后发现都不走索引了,继续查找原因,发现只有单表的时候force index是有效的,继续测试发现是where条件后的or条件导致索引失效,因此采用union替换or的方式优化sql,结果如图所示:

mySql优化-timestamp不走索引及or不走索引优化_第3张图片

 

你可能感兴趣的:(sql)