8.11.3 并发插入

MyISAM存储引擎支持并发插入,以减少给定 table 的读写器之间的争用:如果MyISAMtable 在数据文件中没有孔(中间已删除的行),则可以执行INSERT语句以将行添加到末尾SELECT语句从 table 中读取行的同时显示 table 的数据。如果有多个INSERT语句,它们将与SELECT语句同时排队并按 Sequences 执行。并发INSERT的结果可能不会立即可见。

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

如果使用二进制日志,则并发插入将转换为CREATE ... SELECT插入...选择语句的普通插入。这样做是为了确保您可以通过在备份操作期间应用日志来重新创建 table 的精确副本。参见第 5.4.4 节“二进制日志”。此外,对于那些语句,在从中选择的 table 上放置了一个读取锁,从而阻止了对该 table 的插入。结果是该 table 的并发插入也必须 await。

使用LOAD DATA时,如果为MyISAMtable 指定CONCURRENT满足并发插入的条件(即,中间不包含空闲块),则其他会话可以在LOAD DATA执行时从 table 中检索数据。 CONCURRENT选项的使用会稍微影响LOAD DATA的性能,即使没有其他会话同时使用该 table 也是如此。

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

对于LOCK TABLEREAD LOCALREAD的区别在于READ LOCAL允许在保持锁的同时执行无冲突的INSERT语句(并发插入)。但是,如果您要在持有锁的同时使用服务器外部的进程来操作数据库,则无法使用此功能。