MySQL调优 ---- IN
2015-08-08 02:22
561 查看
在慢查询优化中, 对于 IN 这个关键字的优化的出现概率还是挺高的。 其实对于 IN 关键字出现的 SQL 优化其实难度不高, 重要的是熟悉该 SQL 的应用场景也可以说是业务逻辑。
一、举个最近遇到的例子( 业务: 查询该标签下所有的文章数量 ):
看下 EXPLAIN 结果:
引用MySQL官方文档的一句话:A typical case for poor
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:
EXPLAIN结果:
查询行数锐减, 只要25*1的复杂度就完成了本次查询。
三、 参考资料
MySQL官网
一、举个最近遇到的例子( 业务: 查询该标签下所有的文章数量 ):
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
INsubquery 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官网
相关文章推荐
- EC2开启MySql远程访问
- Mysql数据库主从整理
- MySQL主从服务器数据一致性的核对与修复
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost'
- 【转】 Mysql全文搜索match...against的用法
- Hive 之使用mysql作为hive的metastore
- mysqli 启动出错
- mysql 备份工具xtrabackup(二)
- mac 安装mysql
- 关于XAMPP 无法启动mysql的解决方法
- 使用MySQL Workbench远程管理工具进行远程管理Mysql的错误及解决办法
- 使用MySQL Workbench远程管理工具进行远程管理Mysql的错误及解决办法
- mysql物理级别热备脚本
- Windows下命令安装MySQL.zip压缩包以及修改MySQL密码
- mysql服务器内存使用情况总结
- MySQL使用说明
- node.js mysql
- xe mysql
- debian7安装了mysql后,局域网去连接时出现10061错误
- xtrabackup备份mysql