MySQL索引失效及解决
问题发现
MySQL是一款出色的关系型数据库,在互联网行业中应用广泛。但是MySQL经常是后端开发的瓶颈,因此开发中经常涉及到MySQL的优化。建立索引是一种常见且有效的方式,但是不走索引的情况如何排查解决呢?
EXPLAIN
SELECT COUNT(DISTINCT(s.order_id)) AS order_count,SUM(s.estimate_cos_price) AS order_amount,
date(s.created_date) AS order_time
FROM order_sku_detail s
LEFT JOIN union_order u
ON s.order_id=u.order_id
WHERE (u.valid_code = 16 OR u.valid_code = 17) AND s.delete_status = 0
AND u.delete_status = 0;
执行计划结果为:
经过排查,将SQL语句中OR条件删除,改成
WHERE u.valid_code = 16 AND s.delete_status = 0
AND u.delete_status = 0;
重新开始执行计划,发现走了索引:
问题解决
既然发现了是OR查询条件导致的索引失效,就开始查阅资料,发现很多人都有遇到类似的问题,同时也有很多了给了解决方案用IN替代,于是将查询条件修改为:
WHERE u.valid_code IN (16,17)
AND s.delete_status = 0
AND u.delete_status = 0;
对应的执行计划:
通过执行计划,可以发现,修改为IN查询依然没有起作用。
但是执行时间效率提高了很多,如下图所示:
并且这只是OR连接了两个条件,若是多个条件的话,OR的查询效率会下降更多。实际开发中采用IN查询效率要远远高于OR查询。
[参考阅读]:MySQL的in语句和or哪个执行效率更高?