优化查询以在内部联接中查找MySQL中的avg

时间:2018-06-17 08:10:16

标签: mysql average sqlperformance

目前我正在运行查询以查找加入另一个表的平均值。 结果与预期相符,但效果不佳,需要花费大量时间才能执行。所以需要帮助才能找到更好的查询。目前的查询是:

SELECT AVG(t2.a),
       AVG(t2.b),
       AVG(t2.c),
       t1.column1,
       t1.column2
FROM table1 t1
INNER JOIN table2 t2
    ON t1.column = t2.column
GROUP BY t1.column1, t2.column2

2 个答案:

答案 0 :(得分:0)

将来,当提出与性能相关的问题时,请始终包含EXPLAIN输出。你基本上只是写" EXPLAIN SELECT ....;"它将向您显示该查询的执行计划,其中包含可能暗示可能的优化的详细信息。

两件事:

无索引列上的JOIN可能非常慢。

GROUP BY语句通常是缓慢的查询类型,因为它们需要排序,尤其是在对多个列进行分组时。 GROUP BY可以进行索引扫描,但是这需要在所涉及的列上有元组索引,在您的情况下,因为您从不同的表中选择列可能不起作用。

你有几行?如果您要对数百万行进行分组,您可以轻松地预期查询时间在小时范围内(并且我已经认真对待几个小时)。分组只是一项非常昂贵的操作。特别是因为你有内存限制,这意味着在磁盘上进行排序会因磁盘i / o而导致额外的减速,这比内存慢得多。

答案 1 :(得分:0)

有两个可能的答案。

  • 查询是错误的-因为JOIN发生在AVERAGE之前,因此平均值太多了。

  • 查询是正确的-在这种情况下,有很多工作要做,因此需要时间。我必须相信确实是这种情况,因为您在两个表中都有GROUP BY列。

请提供真实的列名;它可以帮助我们理解查询。

但是假设第一种情况,让我们修复数学加快速度。

  1. 计算机计算“派生”表中的平均值。
  2. 执行JOIN

在我确信此案值得追究之前,我不会尝试编写代码。