这是一个Amazon Aurora实例。
我的查询运行正常并且正在使用具有高基数的索引p_date(datetime)。
但是从最近几天开始,查询需要很长时间。我查看了Newrelic事务日志,发现使用了一个不同的索引状态(VARCHAR),它具有非常低的基数。
通过解释查询,我可以看到它使用索引交集以及另一个也具有低基数作为客户端ID的密钥。
所有指数从一开始就存在。我们在大多数查询中使用where子句中的p_date和status。
DB有什么理由想突然使用这个索引吗?代码中没有任何更改,因此SQL查询是相同的。但是,有问题的表,我上周删除了大量的行(3个表中各9k-15k)。这可能是他们的理由吗?我在这些表上使用随机UUID作为主键。
我是否需要运行“分析表”或类似的东西?我要删除那个索引吗?不确定这是否会对性能产生任何影响。
我保留了数据库实例的默认数据库参数组。那里需要调整吗?
答案 0 :(得分:1)
在标志上加上索引几乎总是无用的(例如status
);我发现你的情况比无用还要糟糕。
摆脱INDEX(status)
按此顺序添加INDEX(status, p_date)
,这样您也可以执行日期范围。
(“指数交叉点”是线索。)
ANALYZE TABLE
,假设它是ENGINE=InnoDB
,速度很快,但很少有任何区别。
为什么“突然”?统计数据随时间而变化,主要是因为增加了数据。