生产库中遇到mysql的子查询
2013-04-27 12:52
274 查看
使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有可能会让你大失所望,在我们的生产系统上就由于碰到了这个问题:
select i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= ’2011-10-07 00:00:00′)
group by i_id;
(备注:sql的业务逻辑可以打个比方:先查询出10-07号新卖出的100本书,然后在查询这新卖出的100本书在全年的销量情况)。
这条sql之所以出现的性能问题在于mysql优化器在处理子查询的弱点,mysql优化器在处理子查询的时候,会将将子查询改写。通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询;但是mysql处理为将会先扫描外面表中的所有数据,每条数据将会传到子查询中与子查询关联,如果外表很大的话,那么性能上将会出现问题;
针对上面的查询,由于table_data这张表的数据有70W的数据,同时子查询中的数据较多,有大量是重复的,这样就需要关联近70W次,大量的关联导致这条sql执行了几个小时也没有执行完成,所以我们需要改写sql:
SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data
WHERE gmt_create >= ’2011-10-07 00:00:00′) t1, table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
我们将子查询改为了关联,同时在子查询中加上distinct,减少t1关联t2的次数;
改造后,sql的执行时间降到100ms以内。
select i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= ’2011-10-07 00:00:00′)
group by i_id;
(备注:sql的业务逻辑可以打个比方:先查询出10-07号新卖出的100本书,然后在查询这新卖出的100本书在全年的销量情况)。
这条sql之所以出现的性能问题在于mysql优化器在处理子查询的弱点,mysql优化器在处理子查询的时候,会将将子查询改写。通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询;但是mysql处理为将会先扫描外面表中的所有数据,每条数据将会传到子查询中与子查询关联,如果外表很大的话,那么性能上将会出现问题;
针对上面的查询,由于table_data这张表的数据有70W的数据,同时子查询中的数据较多,有大量是重复的,这样就需要关联近70W次,大量的关联导致这条sql执行了几个小时也没有执行完成,所以我们需要改写sql:
SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data
WHERE gmt_create >= ’2011-10-07 00:00:00′) t1, table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
我们将子查询改为了关联,同时在子查询中加上distinct,减少t1关联t2的次数;
改造后,sql的执行时间降到100ms以内。
相关文章推荐
- 总结:大唐电信遇到MySQL访问慢问题
- 转:安装MySQL遇到MySQL Server Instance Configuration Wizard未响应的解决办法
- ant 生产hibernater配置文件跟映射文件 mysql为例
- MySQL基础(4)——子查询(嵌套查询)、联结表、组合查询
- SpringBoot插入数据到Mysql中遇到的乱码问题(Mysql环境原因)
- 源码编译MYSQL遇到的几个小问题
- mysql(4) 子查询
- 第一次mysql遇到的问题的解决
- thinkphp中遇到“Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'”
- zabbix自带mysql监控遇到sh: mysql: command not found
- 使用Tomcat操作MySQL时遇到的问题
- 导mysql数据,遇到 longtext 类型,navicat导出会出现乱码
- MySql 使用递归函数时遇到的级联删除问题
- 在idea配置的请况下遇到java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- mysql安装遇到的问题
- linux下mysql的卸载、安装全过程及遇到"MySQL提示:The server quit without updating PID file问题的解决办法"
- MySQL--当mysqldump --single-transaction遇到alter table(2)
- mysql 导出csv 遇到些问题整理包括一些参数说明
- mysql遇到错误: "too many connections" 错误
- linux下关于yum安装mysql卸载后遇到问题