在诸如此类的查询中:
SELECT
AVG(var1) AS var1_average,
AVG(var2) AS var2_average,
(
AVG(var1) +
AVG(var2)
)/2.0 AS total_average
FROM readings
像 AVG(var1)这样的语句会多次出现多次执行,还是内部更有效地缓存?
我的问题来自于试图了解性能/效率。将它写成某种形式的子查询是否更好?它会有多大差异?
答案 0 :(得分:3)
这是一个非常神秘的优化领域,是常见子表达式的优化。在你的例子中,它没什么区别。 group by
对数据进行排序,这比平均数据要贵得多。
还有其他更昂贵的计算,例如count(distinct)
。在这种情况下,你的问题变得更加明显。
如果您真的想比较差异,请执行以下比较。比较您的查询:
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
表中有很多记录,这将无关紧要。