【问题标题】:Optimize SUM() AND GROUP BY MySQL Query优化 SUM() AND GROUP BY MySQL 查询
【发布时间】:2020-05-16 05:34:33
【问题描述】:

我有一张有 161886415 行的表格。当我跑步时:

SELECT * FROM table

需要 0.0083 秒。

但是当我尝试运行时:

SELECT A, SUM(B) 
FROM table 
GROUP BY A

需要无限的时间

我已经有一个 AB 索引,ABBA 复合索引

A 是 date,B 是 int

【问题讨论】:

  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: mysql sql group-by query-optimization


【解决方案1】:

您的比较具有误导性。当您有这样的查询时:

select a.*
from table;

您看到的是返回的第一行,而不是全部。 MySQL 可以在读取行时开始返回行。相比之下,聚合查询需要在返回单行之前读取整个表。

如果您在(A, B) 上有索引,您可能会发现聚合查询更快。但是你好像已经有了这个索引。

您最好的选择是过滤到日期的子集。

【讨论】:

  • 我无法过滤日期的子集。我需要所有人的总和。
  • @shadow 。 . .不幸的是,你可能会被糟糕的group by 性能所困扰。
【解决方案2】:

第一次选择很容易处理。数据库引擎可以对堆存储的数据使用表扫描,当您尝试检索存储在表中的更大百分比的数据时使用。

您应该查看您的查询计划正在使用哪个聚合运算符。此外,您可以编辑您的原始帖子。

索引可能会有所帮助。例如,MariaDB 提供列存储。取决于查询和您的速度期望。

处理 SUM() 性能的类似问题Is it possible to speed up a sum() in MySQL?

【讨论】:

    【解决方案3】:

    您的第一个查询在 8.3 毫秒内返回了全部 1.81 亿行。我认为不会。

    第二个查询,正如您将在EXPLAIN SELECT ... 中看到的那样,有效地使用了INDEX(A, B)。它仍然需要读取该索引中的所有 181 个“行”,因此需要很长时间。

    通常在数据仓库应用程序中,构建和维护“汇总表”以加快处理速度非常有益。您可能对每个A 有一个SUM(B) 的每日小计,然后在需要时汇总小计。

    如果您想进一步讨论,请提供有关表格和查询的更多细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多