MySQL效率 - 在一个查询中重复执行多次执行多次执行?

时间:2013-07-04 13:32:19

标签: mysql sql

在诸如此类的查询中:

SELECT 
AVG(var1) AS var1_average,
AVG(var2) AS var2_average,
(
 AVG(var1) + 
 AVG(var2)
)/2.0 AS total_average
FROM readings

AVG(var1)这样的语句会多次出现多次执行,还是内部更有效地缓存?

我的问题来自于试图了解性能/效率。将它写成某种形式的子查询是否更好?它会有多大差异?

2 个答案:

答案 0 :(得分:3)

这是一个非常神秘的优化领域,是常见子表达式的优化。在你的例子中,它没什么区别。 group by对数据进行排序,这比平均数据要贵得多。

还有其他更昂贵的计算,例如count(distinct)。在这种情况下,你的问题变得更加明显。

在这种情况下,Stephen的子查询比较解决方案可能效果很好。但是,子查询本身会产生大量开销,因为它会创建一个临时表。所以,你不是在比较苹果和苹果。

如果您真的想比较差异,请执行以下比较。比较您的查询:

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average,
       (AVG(var1) + AVG(var2))/2.0 AS total_average
FROM readings;

要:

SELECT AVG(var1) AS var1_average, AVG(var2) AS var2_average
FROM readings;

你可能会发现它们需要大约相同的时间。如果没有,您可以使用子查询方法。或者您可能决定在应用程序级别进行平均计算。

答案 1 :(得分:1)

尝试比较之间的执行时间:

SELECT 
AVG(var1) AS var1_average,
AVG(var2) AS var2_average,
(
 AVG(var1) + 
 AVG(var2)
)/2.0 AS total_average
FROM readings

SELECT
    (var1_average+var2_average)/2.0 AS total_average
    var1_average,
    var2_average
FROM (
    SELECT 
        AVG(var1) AS var1_average,
        AVG(var2) AS var2_average
    FROM readings
) as tmp

确保多次运行它们,并添加SQL_NO_CACHE以获得有意义的结果。

注:的   第二个查询的开销应该很小,因为mysql会创建一个临时表,但如果readings表中有很多记录,这将无关紧要。