对MySQL子查询的简单改写优化
网络编程 2021-07-05 15:27www.168986.cn编程入门
这篇文章主要介绍了对MySQL子查询的简单改写优化,文中的小修改主要将子查询改为关联从而降低查询时关联的次数,需要的朋友可以参考下
使用过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以内。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南