对于“并发插入”,MySQL参考手册有以下解释:
MyISAM存储引擎支持并发插入,以减少给定表的读取器和写入器之间的争用:如果MyISAM表在数据文件中没有漏洞(中间已删除的行),则可以执行INSERT语句将行添加到表的末尾,同时SELECT语句从表中读取行。
http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html
假设我们的数据库“并发插入”参数设置为"Auto“(1)。
我们有一个带间隙的MyISAM表。当我们插入新行并填补这些空白时,表是否“立即”为以后的插入查询接受“并发插入”做好了准备?
还是我们需要在表中没有空白之前运行“优化”?
发布于 2012-07-11 22:01:24
虽然您可以按照罗兰多的建议并将concurrent_insert=2
设置为始终启用并发插入,但要回答有关填充漏洞的问题:
我们有一个带间隙的MyISAM表。当我们插入新行并填补这些空白时,表是否“立即”为以后的插入查询接受“并发插入”做好了准备?
是(强调我的):
如果存在漏洞,则禁用并发插入,但当所有漏洞都已填充新数据时,将再次自动启用。[src]
免责声明:我还没有真正测试过它。看来,除非您在洞中插入完全相同的数据长度,否则在某个地方仍然会有洞。
您可以看到这样的查询是否存在漏洞(data_free=0意味着没有漏洞):
SELECT table_name, data_free FROM information_schema.tables WHERE table_schema='FOO' AND engine='myisam'
发布于 2012-07-11 21:07:22
您可能应该将并发性_插入设置为2。
首先,将其添加到/etc/my.cnf中。
[mysqld]
concurrent_insert=2
然后重新启动mysqld。如果无法重新启动mysqld,请等到非高峰时间,然后运行。
SET GLOBAL concurrent_insert = 2;
这样做毫无疑问,并发插入正在运行。
在一个真正的非高峰窗口中,您总是可以做OPTIMIZE TABLE
。
如果您不喜欢每周concurrent_insert
,您可以加快MyISAM的成本。多少钱?
默认情况下,每当创建MyISAM表时,行格式都是动态的。如果你跑
ALTER TABLE mytable ROW_FORMAT=Fixed;
在每个MyISAM表上,这将使每个MyISAM上的读/写I/O增加20-25%,而不会更改任何其他内容。再说一遍,代价是什么?在大多数情况下,这张桌子的大小将翻一番。我以前写过关于MyISAM性能增强/权衡的文章:
https://dba.stackexchange.com/questions/20745
复制相似问题