使用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。