【问题标题】:Optimized query to find avg in MySQL with inner join优化查询以使用内部连接在 MySQL 中查找 avg
【发布时间】:2018-06-17 08:10:16
【问题描述】:

目前我正在运行一个查询来查找平均加入一个表。 结果与预期的一样,但性能不是很好,需要很长时间才能执行。所以需要帮助来找到更好的查询。当前查询是:

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

【问题讨论】:

  • 你必须执行相同的平均三次吗?
  • 不,有 3 个不同的列。

标签: mysql average sqlperformance


【解决方案1】:

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

两件事:

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

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

你有多少行?如果您要对数亿行进行分组,您可以很容易地预期查询时间在 小时 范围内(我对小时很认真)。分组只是一个非常昂贵的操作。特别是因为您有内存限制,这意味着排序发生在磁盘上,由于磁盘 i/o 比内存慢得多,这会导致额外的减速。

【讨论】:

  • 目前 EXPLAIN 给出了以下查询结果:
  • *************************** 1. 行 ************ ****************** id: 1 select_type: SIMPLE table: mid partitions: NULL type: ALL possible_keys: PRIMARY,UIDX_mac_ifid key: NULL key_len: NULL ref: NULL rows: 8114 过滤: 100.00额外:使用临时;使用文件排序
  • *************************** 2. 行 ************ ****************** id: 1 select_type: SIMPLE table: m partitions: NULL type: eq_ref possible_keys: PRIMARY,UIDX_mac,IDX_mac_time key: UIDX_mac key_len: 25 ref: Summit_lab.mid.mac_address行:1 过滤:100.00 额外:使用索引条件
【解决方案2】:

有两种可能的答案。

  • 查询错误——因为JOIN出现在AVERAGE之前,所以平均行数太多。

  • 查询是正确的——在这种情况下,有很多工作要做,所以需要时间。我不得不相信是这种情况,因为你 GROUP BY 两个表中的列。

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

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

  1. 计算“派生”表中的平均值。
  2. 发送JOIN

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2020-01-02
    相关资源
    最近更新 更多