在mysql中用平均优化的查询来查找具有内部连接的avg

zsbz8rwp  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(319)

目前,我正在运行一个查询,以找到平均加入一个以上的表。结果与预期一致,但执行效果不太好,需要花费大量时间。所以需要一个帮助来找到更好的查询。当前查询是:

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
dddzy1tm

dddzy1tm1#

今后在询问与绩效相关的问题时,请始终包括解释输出。你基本上只需要写“解释选择…”它将向您显示该查询的执行计划,其中包含可能提示可能的优化的详细信息。
两件事:
未编制索引的列上的联接可能非常慢。
GROUPBY语句通常是一种很慢的查询,因为它们需要排序,特别是在对多个列进行分组时。groupby可以进行索引扫描,但这需要在涉及的列上有元组索引,在您的情况下,因为您从不同的表中选择列可能不起作用。
你有几排?如果您要对数亿行进行分组,很容易就可以预期查询时间在小时范围内(我对小时是非常认真的)。分组只是一个极其昂贵的操作。特别是因为内存有限,这意味着排序发生在磁盘上,磁盘i/o比内存慢得多,这会导致额外的速度减慢。

ddarikpa

ddarikpa2#

有两种可能的答案。
这个查询是错误的——因为 JOIN 发生在 AVERAGE ,因此平均值太多行。
这个查询是对的——在这种情况下,有很多工作要做,所以需要时间。我不得不相信这是事实,因为你 GROUP BY 两个表中的列。
请提供真实的列名;它可以帮助我们理解这个问题。
但是假设第一种情况,让我们修正数学并加快速度。
用计算机计算“导出”表中的平均数。
做那件事 JOIN .
在我确信这个案子值得继续之前,我不会尝试写代码。

相关问题