【问题标题】:Do MySQL (5.7) indexes take a while to update after many UPDATE / INSERT operations?MySQL (5.7) 索引在多次 UPDATE / INSERT 操作后是否需要一段时间才能更新?
【发布时间】:2020-02-07 10:11:54
【问题描述】:
我遇到了与https://bugs.mysql.com/bug.php?id=94068 类似的“错误”,在我对表运行许多INSERT/UPDATE 操作后,我在生成的列上创建的索引似乎无效。但是,如果我删除并重新创建索引,我的查询速度很快。我不确定,如果有足够的时间,最初创建的索引是否会自行“更新”并再次发挥作用。
错误作者指出,他们不仅在生成列上的索引中观察到这种行为,而且在使用触发器编写实际列时也观察到这种行为。我不太明白 MySQL 开发人员对为什么它是预期行为的解释,因为删除和重新创建索引会大大提高性能......这是预期的吗??
只是想知道是否有其他人遇到过这个问题,以及他们是如何处理的。感谢您的帮助!
【问题讨论】:
标签:
mysql
indexing
query-optimization
mysql-5.7
database-indexes
【解决方案1】:
简短回答:不。
长答案:
就程序而言,索引,无论是否UNIQUE,都会“立即”更新。
在INSERT 上,必须在INSERT 完成之前检查所有唯一键是否存在“重复键”(或由于重复键而失败)。非唯一键更新放入“更改缓冲区”以最终刷新到磁盘。但是,对索引的任何使用也会检查更改缓冲区,因此您实际上忽略了更改缓冲区的存在。
如果问题是关于随着时间的推移改变EXPLAIN 计划,就像错误报告似乎在谈论的那样,那是另一回事。考虑到这一点,您需要重新表述您的问题。
重新创建索引是一项繁重的操作。下一次,做ANALYZE TABLE。这将刷新表上所有索引的统计信息。以下是您可能遇到的情况:
- 查询很好地使用了索引。
- 您添加了大量新行,从而使统计数据不再完全正确。
- 由于每个查询都独立决定使用哪个索引,甚至决定是否使用任何索引,您的查询可能会“突然”选择使用以前未使用过的索引,反之亦然。
-
ANALYZE TABLE 主动刷新统计数据。
- 现在您的查询可能返回到之前使用(或不使用)所需索引的方式。
最好谈谈特定查询及其SHOW CREATE TABLE。我们可以做一些事情来加快查询速度和/或防止我假设的问题。