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
语句(并发插入)。但是,如果要在持有锁的同时使用服务器外部的进程操作数据库,则不能使用此选项。