swx_order表和swx_order_provider表和swx_order_servicer表联查,where条件是last_modify_time,三张表的数据量都在40万以上,如下sql查询时间非常慢,而且主表(swx_order)时而走索引,时而不走索引,当last_modify_time时间区间很小时走索引,时间区间大之后就不走索引了,原因是如果加了索引的行数比较多,mysql的优化器会自动放弃索引而选择全表扫描
详细解释参考:MySQL :: MySQL 8.0 Reference Manual :: 8.9.4 Index Hints
优化思路:强制sql执行时使用索引,也就是不需要mysql的优化器去选择,通过use index和force index可以强制sql任何时间都走索引,优化后如图所示:
添加force index之后发现都不走索引了,继续查找原因,发现只有单表的时候force index是有效的,继续测试发现是where条件后的or条件导致索引失效,因此采用union替换or的方式优化sql,结果如图所示: