Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Concurrent Inserts

10.11.3 并发插入

MyISAM 存储引擎支持并发插入,以减少读者和写者的竞争:如果一个 MyISAM 表没有数据文件中的空洞(删除的行在中间),可以同时执行INSERT语句将行添加到表尾,同时读取表的SELECT语句。如果有多个INSERT语句,他们将被队列化并顺序执行,和SELECT语句同时进行。并发INSERT的结果可能不立即可见。

系统变量concurrent_insert可以用来修改并发插入处理。默认情况下,该变量设置为AUTO(或1),并发插入将被处理如前所述。如果concurrent_insert设置为NEVER(或0),并发插入将被禁用。如果变量设置为ALWAYS(或2),即使表中有删除的行,表尾部也允许并发插入。请参阅concurrent_insert系统变量的描述。

如果您使用二进制日志,CREATE ... SELECTINSERT ... SELECT语句将被转换为正常插入,以确保在备份操作中可以重新创建表的精准副本。请参阅第7.4.4节,“二进制日志”。此外,对于这些语句,读锁定将被置于所选表上,以阻止该表的插入。结果是,该表的并发插入也必须等待。

使用LOAD DATA,如果指定了CONCURRENT,并且表格满足并发插入的条件(即中间没有空块),那么其他会话可以在LOAD DATA执行时从表格中检索数据。使用CONCURRENT选项对LOAD DATA的性能有一定的影响,即使没有其他会话同时使用该表格。

如果指定了HIGH_PRIORITY--low-priority-updates选项,并且也不能使用并发插入。

对于LOCK TABLEREAD LOCALREAD的区别是READ LOCAL允许非冲突INSERT语句(并发插入)在锁定时执行,但是如果你要使用外部进程来操作数据库,那么不能使用这个选项。