8.11.3 并发插入
MyISAM
存储引擎支持并发插入,以减少给定 table 的读写器之间的争用:如果MyISAM
table 在数据文件中没有孔(中间已删除的行),则可以执行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时,如果为MyISAM
table 指定CONCURRENT
满足并发插入的条件(即,中间不包含空闲块),则其他会话可以在LOAD DATA执行时从 table 中检索数据。 CONCURRENT
选项的使用会稍微影响LOAD DATA的性能,即使没有其他会话同时使用该 table 也是如此。
如果指定HIGH_PRIORITY
,并且服务器使用该选项启动时,它将覆盖--low-priority-updates选项的效果。这还会导致不使用并发插入。
对于LOCK TABLE,READ LOCAL
和READ
的区别在于READ LOCAL
允许在保持锁的同时执行无冲突的INSERT语句(并发插入)。但是,如果您要在持有锁的同时使用服务器外部的进程来操作数据库,则无法使用此功能。