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