Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Concurrent Inserts

10.11.3 并发插入

MyISAM 存储引擎支持并发插入,以减少读者和写者之间的争用对于给定的表:如果 MyISAM 表中没有数据文件中的空隙(中间的删除行),则可以在读取表中的同时执行 INSERT 语句,以将行添加到表的末尾。如果有多个 INSERT 语句,它们将被排队并顺序执行,同时与 SELECT 语句并发执行。并发 INSERT 的结果可能不会立即可见。

可以设置 concurrent_insert 系统变量以修改并发插入处理。默认情况下,该变量设置为 AUTO(或 1),并发插入将按照上述方式处理。如果 concurrent_insert 设置为 NEVER(或 0),则并发插入将被禁用。如果变量设置为 ALWAYS(或 2),则即使表中有删除的行,也允许在表末尾进行并发插入。另请参阅 concurrent_insert 系统变量的描述。

如果您使用二进制日志,则并发插入将被转换为正常插入,以便在 CREATE ... SELECTINSERT ... SELECT 语句中。这是为了确保您可以通过应用日志在备份操作中重新创建表的 exact 副本。另请参阅 第 7.4.4 节,“二进制日志”。此外,对于这些语句,将在所选表上放置读锁,以便阻止对该表的插入。结果是,对该表的并发插入也必须等待。

使用 LOAD DATA,如果您指定 CONCURRENT 与一个满足并发插入条件的 MyISAM 表(即,该表中没有中间的空闲块),其他会话可以在 LOAD DATA 执行期间从表中检索数据。使用 CONCURRENT 选项会对 LOAD DATA 的性能产生一些影响,即使没有其他会话在同一时间使用该表。

如果您指定 HIGH_PRIORITY,它将覆盖 --low-priority-updates 选项的效果,如果服务器是使用该选项启动的。它还会导致并发插入不被使用。

对于 LOCK TABLEREAD LOCALREAD 之间的区别是,READ LOCAL 允许执行非冲突的 INSERT 语句(并发插入)在锁定期间执行。然而,这不能用于您计划使用服务器外部进程来操作数据库时持有锁定。