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