快速 MySQL 查询在添加 SUM 时变得非常慢
Fast MySQL query gets very slow when adding SUM
我有这个查询,运行 在 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
。
有什么办法可以解决这个问题吗?
您已有的索引(paid_at
、kind
、sub_kind
)非常擅长查找和选择行。
此索引包含第一个查询 return 结果所需的所有信息,但不包含第二个查询所需的所有信息。因此,第二个查询需要对table进行一次“secondary index seek”。这在基于索引的引擎中很常见。
一般来说,这不是什么大问题,除非您需要非常高的性能,或者如果您要选择大量行。
如果您需要查询速度更快,您可以尝试用 覆盖索引 替换该索引。覆盖索引不会遇到“辅助索引查找”问题,而且应该更快。
在这种情况下,您应该创建索引:
create index ix1 on revenues (paid_at, kind, sub_kind, iugu_fee_cents);
我有这个查询,运行 在 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
。
有什么办法可以解决这个问题吗?
您已有的索引(paid_at
、kind
、sub_kind
)非常擅长查找和选择行。
此索引包含第一个查询 return 结果所需的所有信息,但不包含第二个查询所需的所有信息。因此,第二个查询需要对table进行一次“secondary index seek”。这在基于索引的引擎中很常见。
一般来说,这不是什么大问题,除非您需要非常高的性能,或者如果您要选择大量行。
如果您需要查询速度更快,您可以尝试用 覆盖索引 替换该索引。覆盖索引不会遇到“辅助索引查找”问题,而且应该更快。
在这种情况下,您应该创建索引:
create index ix1 on revenues (paid_at, kind, sub_kind, iugu_fee_cents);