对于“并发插入”,MySQL参考手册有如下解释:
MyISAM 存储引擎支持并发插入,以减少给定表的读写器之间的争用:如果 MyISAM 表在数据文件中没有空洞(中间删除的行),则可以执行 INSERT 语句将行添加到末尾在 SELECT 语句从表中读取行的同时对表进行操作。
http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html
假设我们的数据库“并发插入”参数设置为“自动”(1)。
我们有一个有间隙的 MyISAM 表。当我们插入新行并填补这些空白时,表是否“立即”准备好接受未来插入查询的“并发插入”?
或者我们是否需要在表格知道没有间隙之前运行“OPTIMIZE”?
虽然您可以按照Rolando的建议进行操作并设置
concurrent_insert=2
为始终启用并发插入,以回答您关于填充孔的问题:是的(强调我的):
免责声明:我还没有实际测试过它。似乎除非您在孔中插入完全相同的数据长度,否则您仍然会在某处有孔。
您可以从这样的查询中查看是否有漏洞(data_free=0 表示没有漏洞):
您可能应该将concurrent_insert设置为 2。
首先,将其添加到 /etc/my.cnf
然后重启mysqld。如果不能重启mysqld,等到非高峰时间再运行
这样做毫无疑问,并发插入正在运行。
您总是可以
OPTIMIZE TABLE
在真正的非高峰时段进行。如果您不喜欢 tweek
concurrent_insert
,您可以为 MyISAM 加快速度,但需要付出一定的代价。什么费用?默认情况下,无论何时创建 MyISAM 表,行格式都是动态的。如果你跑
在每个 MyISAM 表上,这将在每个 MyISAM 上增加 20-25% 的读/写 I/O,而不会更改任何其他内容。再说一次,代价是什么?在大多数情况下,桌子的大小会翻倍。我之前写过这个 MyISAM 性能增强/权衡: