简单的重写优化MySQL的子查询

简单的重写优化MySQL的子查询
使用Oracle或DBA或其他数据库开发人员都有这样的经历,在子查询对数据库进行了优化,可以驱动表的一个很好的选择,然后放在一个MySQL数据库的经验,但不幸的是,MySQL可以在子查询的处理会让你在我们的生产系统极大的失望,因为它遇到的问题:
选择i_id,和(i_sell)作为i_sell

从table_data

在那里i_id(选择从哪里i_id table_data gmt_create 00:00:00> = '2011-10-07)

集团通过i_id;

(备注:SQL的业务逻辑可以比喻:首先,搜索出100个新的图书销售的小白之,然后询问100新书在全年销售额)。

此SQL的性能问题在于MySQL优化器在处理子查询时的弱点。MySQL查询优化器将改写在处理子查询。通常情况下,我们希望从内到外,完整的查询结果,然后完成查询驱动的查询表的子查询;但MySQL处理首先会扫描表中的所有数据,每个子查询和数据将被传输到子查询有关,如果看起来不错,性能也会有问题;

根据上述查询,因为与70W数据table_data表数据,而数据的子查询,大量是重复的,所以我们需要很多的时间70w关联,关联结果的SQL执行几个小时没有执行,所以我们需要重写SQL:
选择t2.i_id,总和(T2。i_sell)出售

从(选择不同的i_id从table_data)

在gmt_create '2011-10-07 00:00:00)> = table_data,T1,T2

在t1.i_id = t2.i_id组t2.i_id;

我们改变了子查询的关联,并添加不同的子查询减少T1 T2的数量相关。

改造后,SQL语句的执行时间减少到小于100ms。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部