MySQL调优 ---- IN

  在慢查询优化中, 对于 IN 这个关键字的优化的出现概率还是挺高的。 其实对于 IN 关键字出现的 SQL 优化其实难度不高, 重要的是熟悉该 SQL 的应用场景也可以说是业务逻辑。


  一、举个最近遇到的例子( 业务: 查询该标签下所有的文章数量 ):
select count(*) from cms_article ca where 某个TagID in (select cat.tag_id from cms_article_tag cat where ca.id=cat.article_id)


看下 EXPLAIN 结果:


引用MySQL官方文档的一句话:A typical case for poor IN subquery performance is when the subquery returns a small number of rows but the outer query returns a large number of rows to be compared to the subquery result.

可以从 EXPLAIN 结果明显看出, IN 子查询就扫了2行, 而另一个查询扫描了大量行数, 完全符合官方文档说的慢查询情况。




  二、如何优化呢?
 
  本文开头就说了, 先熟悉业务逻辑, 然后就很好改了。
引用MySQL官方文档的解决方案:The optimizer is more mature for joins than for subqueries, so in many cases a statement that uses a subquery can be executed more efficiently if you rewrite it as a join.[也就是熟悉业务, 然后大多数情况都能改成 JOIN 的方式来优化]

优化后SQL:
select count(*) from cms_article ca RIGHT JOIN cms_article_tag cat ON cna.id = cnat.article_id WHERE cnat.tag_id=某TagID



EXPLAIN结果:

查询行数锐减, 只要25*1的复杂度就完成了本次查询。 



  三、 参考资料

                         MySQL官网




  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值