MySQL 8.0 参考手册  / 第8章优化  / 8.11 优化锁定操作  /  8.11.3 并发插入

8.11.3 并发插入

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

concurrent_insert可以设置系统变量来修改并发插入处理 。默认情况下,该变量设置为AUTO(或 1),并发插入如前所述进行处理。如果 concurrent_insert设置为 NEVER(或 0),并发插入将被禁用。如果该变量设置为ALWAYS (或 2),则即使对于已删除行的表,也允许在表末尾进行并发插入。另见concurrent_insert系统变量的说明。

在可以使用并发插入的情况下,很少需要对语句使用DELAYED 修饰符。INSERT请参阅第 13.2.5.3 节,“插入延迟语句”

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

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

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

对于,和LOCK TABLE之间的区别在于, 允许 在持有锁的同时执行非冲突语句(并发插入)。但是,如果您打算在持有锁的同时使用服务器外部的进程来操作数据库,则不能使用此方法。 READ LOCALREADREAD LOCALINSERT