gpt4 book ai didi

mysql - 在 MYSQL InnoDB 中更新索引列时的 SELECT/INSERT 性能

转载 作者:行者123 更新时间:2023-11-28 23:15:54 25 4
gpt4 key购买 nike

假设我有一个结构如下的表:

id (int[11]), name(VARCHAR[255])

name 列有一个 b-tree 索引。

让我们假设按以下顺序对该表进行查询:

  1. 插入
  2. 选择
  3. 插入

现在,我知道在索引表中插入新行时需要更新索引。这需要时间。但是我的问题是:

  1. SELECT 是等待索引更新,还是只搜索以前版本的表,还是有其他问题?
  2. 第二个 INSERT 会发生什么?它是否会等待索引从之前的 INSERT 完全更新?

谢谢。

UPDATE

假设在发出 SELECT 查询时插入还没有完成更新索引。

最佳答案

我认为这里有一些很好的信息: https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html

和: https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-structure.html

但一般来说,Insert 会锁定行,但不会阻止 Select(即使是新的 Insert)。由于新插入而当前正在构建的依赖于索引的 Select 查询在构建索引之前不会“看到”新行。

每个插入操作 = 将数据插入行 + 更改受影响的索引。您拥有的索引越多,插入过程越长,后续 SELECT 查询找到新行所需的时间就越长。

如果您正在编写代码,那么您可以让您的 Select 等待 Insert 完成。


根据以下评论添加更正和改进

我不是说该语句执行时间更长,我的意思是如果你在时间 A 插入一行,并且需要 5 秒才能完成操作,那么选择查询将在 A+2 秒运行'看到该行,在 A+6 秒运行的选择查询将看到该行。

更清楚 - 插入不会延迟选择,除非您将数据库配置为在插入时具有表锁,但在插入完成之前,您不会在任何选择查询中看到插入。

关于mysql - 在 MYSQL InnoDB 中更新索引列时的 SELECT/INSERT 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43894049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com