MyISAM
存储引擎支持并发插入,以减少读者和写者之间的争用对于给定的表:如果 MyISAM
表中没有数据文件中的空隙(中间的删除行),则可以在读取表中的同时执行 INSERT
语句,以将行添加到表的末尾。如果有多个 INSERT
语句,它们将被排队并顺序执行,同时与 SELECT
语句并发执行。并发 INSERT
的结果可能不会立即可见。
可以设置 concurrent_insert
系统变量以修改并发插入处理。默认情况下,该变量设置为 AUTO
(或 1),并发插入将按照上述方式处理。如果 concurrent_insert
设置为 NEVER
(或 0),则并发插入将被禁用。如果变量设置为 ALWAYS
(或 2),则即使表中有删除的行,也允许在表末尾进行并发插入。另请参阅 concurrent_insert
系统变量的描述。
如果您使用二进制日志,则并发插入将被转换为正常插入,以便在 CREATE ... SELECT
或 INSERT ... SELECT
语句中。这是为了确保您可以通过应用日志在备份操作中重新创建表的 exact 副本。另请参阅 第 7.4.4 节,“二进制日志”。此外,对于这些语句,将在所选表上放置读锁,以便阻止对该表的插入。结果是,对该表的并发插入也必须等待。
使用 LOAD DATA
,如果您指定 CONCURRENT
与一个满足并发插入条件的 MyISAM
表(即,该表中没有中间的空闲块),其他会话可以在 LOAD DATA
执行期间从表中检索数据。使用 CONCURRENT
选项会对 LOAD DATA
的性能产生一些影响,即使没有其他会话在同一时间使用该表。
如果您指定 HIGH_PRIORITY
,它将覆盖 --low-priority-updates
选项的效果,如果服务器是使用该选项启动的。它还会导致并发插入不被使用。
对于 LOCK TABLE
,READ LOCAL
和 READ
之间的区别是,READ LOCAL
允许执行非冲突的 INSERT
语句(并发插入)在锁定期间执行。然而,这不能用于您计划使用服务器外部进程来操作数据库时持有锁定。