【问题标题】:Fast MySQL query gets very slow when adding SUM添加 SUM 时,快速 MySQL 查询变得非常慢
【发布时间】:2021-12-30 22:30:50
【问题描述】:

我有这个查询,在 AWS Aurora 上运行,在 MySQL 模式下,它非常快(100 毫秒):

select rv.kind, rv.sub_kind, count(*)
from revenues rv
where rv.paid_at = '2021-11-17'
group by rv.kind, rv.sub_kind;

但是,如果我加上一个总和,它会非常变慢(1 分 20 秒):

select rv.kind, rv.sub_kind, count(*), sum(iugu_fee_cents)
from revenues rv
where rv.paid_at = '2021-11-17'
group by rv.kind, rv.sub_kind;

这是一个简单的查询,我有一个包含paid_at, kind, and sub_kind 的复合索引,按此顺序排列。在两个查询中使用EXPLAIN 确认索引正在被使用。

两个查询的其他信息相同,除了 Extra 列,它显示 Using where; Using index 用于快速查询,Using index condition 用于慢速查询。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 可能您的第一个查询被索引覆盖,第二个查询虽然使用索引来定位行现在必须查找 iugu_fee_cents在基表中,所以将此列添加到您的索引中。
  • 非常感谢,我刚看到这个问题,提示相同:stackoverflow.com/questions/1687548/…
  • 请提供SHOW CREATE TABLE;您的描述中可能遗漏了一些微妙的问题。

标签: mysql sql optimization indexing amazon-aurora


【解决方案1】:

您已有的索引(paid_atkindsub_kind)非常适合查找和选择行。

此索引包含第一个查询返回结果所需的所有信息,但不包含第二个查询所需的所有信息。因此,第二个查询需要对表执行“二级索引查找”。这在基于索引的引擎中很常见。

一般来说,这不是什么大问题,除非您需要非常高的性能,或者如果您要选择大量行。

如果您需要更快的查询,您可以尝试将该索引替换为覆盖索引。覆盖索引不会出现“二级索引查找”问题,应该更快。

在这种情况下,您应该创建索引:

create index ix1 on revenues (paid_at, kind, sub_kind, iugu_fee_cents);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2021-03-01
    相关资源
    最近更新 更多