我有這個查詢,在 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 indexUsing index condition
我能做些什么來解決這個問題嗎?
uj5u.com熱心網友回復:
您已有的索引 ( paid_at, kind, sub_kind) 非常擅長查找和選擇行。
該索引包含第一個查詢回傳結果所需的所有資訊,但不包含第二個查詢所需的所有資訊。因此,第二個查詢需要對表執行“二級索引查找”。這在基于索引的引擎中很常見。
一般來說,這不是什么大問題,除非您需要非常高的性能,或者您要選擇大量行。
如果您需要更快的查詢,您可以嘗試用覆寫索引替換該索引。覆寫索引不會受到“二級索引搜索”問題的影響,應該更快。
在這種情況下,您應該創建索引:
create index ix1 on revenues (paid_at, kind, sub_kind, iugu_fee_cents);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362098.html
上一篇:Error(1064)(42000):檢查與您的MySQL服務器版本相對應的手冊,以獲取在第9行“)”附近使用的正確語法
下一篇:如何在MySQL中執行半連接?
