MySQL调优 ---- IN
来源:互联网 发布:阿里云人工在线客服 编辑:程序博客网 时间:2024/06/15 06:45
在慢查询优化中, 对于 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 0
- MySQL调优 ---- IN
- mysql --in
- mysql in
- mysql IN NOT IN
- mysql not in 和in
- Mysql Specific in Appfuse
- Replace function in MySQL
- Compile mysql in vmware
- MySQL in a Nutshell
- MySQL in a Nutshell
- mysql IN的问题
- Mysql In子句删除
- mysql in 排序
- MySQL HandlerSocket in Action
- MySql install in Ubuntu
- LEFT JOIN in MySQL
- View in MySQL
- mysql 中的 in
- 做事先做人
- 作为30岁才开始学Java、Android的老人家,捣鼓了一整天才写出这个小东西,发上来给各位大神抽一下 ……
- 字符串模拟利用gson解析与生成json
- GitHub for Windows的Git Shell 执行是颜色所代表的意义
- OC_NSUseDefault
- MySQL调优 ---- IN
- 黑马程序员_java_API总结
- 黑马程序员_java_IO流总结(上)
- 了解Android微信里的WebView是如何实现分享的功能
- 黑马程序员_java_IO流总结(中)
- 黑马程序员_java_IO流总结(下)
- 黑马程序员_java_多线程总结(上)
- 黑马程序员_java_多线程总结(下)
- 黑马程序员_java_反射总结