【问题标题】: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。这将刷新表上所有索引的统计信息。以下是您可能遇到的情况:

    1. 查询很好地使用了索引。
    2. 您添加了大量新行,从而使统计数据不再完全正确。
    3. 由于每个查询都独立决定使用哪个索引,甚至决定是否使用任何索引,您的查询可能会“突然”选择使用以前未使用过的索引,反之亦然。
    4. ANALYZE TABLE 主动刷新统计数据。
    5. 现在您的查询可能返回到之前使用(或不使用)所需索引的方式。

    最好谈谈特定查询及其SHOW CREATE TABLE。我们可以做一些事情来加快查询速度和/或防止我假设的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多