【MySQL】一次线上的OR查询导致的索引失效 附解决方案

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;

执行计划结果为:
chuxlu@163.com
经过排查,将SQL语句中OR条件删除,改成

 WHERE u.valid_code = 16  AND s.delete_status = 0
 AND u.delete_status = 0;

重新开始执行计划,发现走了索引:
chuxlu@163.com

问题解决

既然发现了是OR查询条件导致的索引失效,就开始查阅资料,发现很多人都有遇到类似的问题,同时也有很多了给了解决方案用IN替代,于是将查询条件修改为:

 WHERE u.valid_code IN (16,17)
 AND s.delete_status = 0
 AND u.delete_status = 0;

对应的执行计划:
chuxlu@163.com
通过执行计划,可以发现,修改为IN查询依然没有起作用。
但是执行时间效率提高了很多,如下图所示:
在这里插入图片描述
并且这只是OR连接了两个条件,若是多个条件的话,OR的查询效率会下降更多。实际开发中采用IN查询效率要远远高于OR查询。

[参考阅读]:MySQL的in语句和or哪个执行效率更高?

发布了28 篇原创文章 · 获赞 12 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Carson_Chu/article/details/103830968