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 语句(并发插入)在锁定期间执行。然而,这不能用于您计划使用服务器外部进程来操作数据库时持有锁定。