10.11.3 并发插入
MyISAM 存储引擎支持并发插入,以减少读者和写者的竞争:如果一个 MyISAM 表没有数据文件中的空洞(删除的行在中间),可以同时执行INSERT
语句将行添加到表尾,同时读取表的SELECT
语句。如果有多个INSERT
语句,他们将被队列化并顺序执行,和SELECT
语句同时进行。并发INSERT
的结果可能不立即可见。
系统变量concurrent_insert
可以用来修改并发插入处理。默认情况下,该变量设置为AUTO
(或1),并发插入将被处理如前所述。如果concurrent_insert
设置为NEVER
(或0),并发插入将被禁用。如果变量设置为ALWAYS
(或2),即使表中有删除的行,表尾部也允许并发插入。请参阅concurrent_insert
系统变量的描述。
如果您使用二进制日志,CREATE ... SELECT
或INSERT ... SELECT
语句将被转换为正常插入,以确保在备份操作中可以重新创建表的精准副本。请参阅第7.4.4节,“二进制日志”。此外,对于这些语句,读锁定将被置于所选表上,以阻止该表的插入。结果是,该表的并发插入也必须等待。
使用LOAD DATA
,如果指定了CONCURRENT
,并且表格满足并发插入的条件(即中间没有空块),那么其他会话可以在LOAD DATA
执行时从表格中检索数据。使用CONCURRENT
选项对LOAD DATA
的性能有一定的影响,即使没有其他会话同时使用该表格。
如果指定了HIGH_PRIORITY
--low-priority-updates
选项,并且也不能使用并发插入。
对于
LOCK TABLE
,READ LOCAL
和READ
的区别是READ LOCAL
允许非冲突INSERT
语句(并发插入)在锁定时执行,但是如果你要使用外部进程来操作数据库,那么不能使用这个选项。