加入收藏 | 设为首页 | 会员中心 | 我要投稿 鄂州站长网 (https://www.0711zz.com/)- 数据分析、网络、云渲染、应用安全、大数据!
当前位置: 首页 > 数据库 > MySql > 正文

Mysql实例对MySQL子查询的简单改写优化

发布时间:2020-07-03 09:55:55 所属栏目:MySql 来源:互联网
导读:介绍《Mysql实例对MySQL子查询的简单改写优化》开发教程,希望对您有用。

《Mysql实例对MySQL子查询的简单改写优化》要点:
本文介绍了Mysql实例对MySQL子查询的简单改写优化,希望对您有用。如果有疑问,可以联系我们。

MYSQL实例使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,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;

MYSQL实例(备注:sql的业务逻辑可以打个比方:先查询出10-07号新卖出的100本书,然后在查询这新卖出的100本书在全年的销量情况).

MYSQL实例这条sql之所以出现的性能问题在于mysql优化器在处理子查询的弱点,mysql优化器在处理子查询的时候,会将将子查询改写.通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询;但是mysql处理为将会先扫描外面表中的所有数据,每条数据将会传到子查询中与子查询关联,如果外表很大的话,那么性能上将会出现问题;

MYSQL实例针对上面的查询,由于table_data这张表的数据有70W的数据,同时子查询中的数据较多,有大量是重复的,这样就需要关联近70W次,大量的关联导致这条sql执行了几个小时也没有执行完成,所以我们需要改写sql:

MYSQL实例
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;

MYSQL实例我们将子查询改为了关联,同时在子查询中加上distinct,减少t1关联t2的次数;

MYSQL实例改造后,sql的执行时间降到100ms以内.

(编辑:鄂州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读