首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql如何决定是否可以对MyISAM表进行并发插入?

mysql如何决定是否可以对MyISAM表进行并发插入?
EN

Database Administration用户
提问于 2012-07-11 20:52:52
回答 2查看 9.1K关注 0票数 3

对于“并发插入”,MySQL参考手册有以下解释:

MyISAM存储引擎支持并发插入,以减少给定表的读取器和写入器之间的争用:如果MyISAM表在数据文件中没有漏洞(中间已删除的行),则可以执行INSERT语句将行添加到表的末尾,同时SELECT语句从表中读取行。

http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html

假设我们的数据库“并发插入”参数设置为"Auto“(1)。

我们有一个带间隙的MyISAM表。当我们插入新行并填补这些空白时,表是否“立即”为以后的插入查询接受“并发插入”做好了准备?

还是我们需要在表中没有空白之前运行“优化”?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2012-07-11 22:01:24

虽然您可以按照罗兰多的建议并将concurrent_insert=2设置为始终启用并发插入,但要回答有关填充漏洞的问题:

我们有一个带间隙的MyISAM表。当我们插入新行并填补这些空白时,表是否“立即”为以后的插入查询接受“并发插入”做好了准备?

是(强调我的):

如果存在漏洞,则禁用并发插入,但当所有漏洞都已填充新数据时,将再次自动启用。[src]

免责声明:我还没有真正测试过它。看来,除非您在洞中插入完全相同的数据长度,否则在某个地方仍然会有洞。

您可以看到这样的查询是否存在漏洞(data_free=0意味着没有漏洞):

代码语言:javascript
运行
复制
SELECT table_name, data_free FROM information_schema.tables WHERE table_schema='FOO' AND engine='myisam'
票数 6
EN

Database Administration用户

发布于 2012-07-11 21:07:22

您可能应该将并发性_插入设置为2。

首先,将其添加到/etc/my.cnf中。

代码语言:javascript
运行
复制
[mysqld]
concurrent_insert=2

然后重新启动mysqld。如果无法重新启动mysqld,请等到非高峰时间,然后运行。

代码语言:javascript
运行
复制
SET GLOBAL concurrent_insert = 2;

这样做毫无疑问,并发插入正在运行。

在一个真正的非高峰窗口中,您总是可以做OPTIMIZE TABLE

如果您不喜欢每周concurrent_insert,您可以加快MyISAM的成本。多少钱?

默认情况下,每当创建MyISAM表时,行格式都是动态的。如果你跑

代码语言:javascript
运行
复制
ALTER TABLE mytable ROW_FORMAT=Fixed;

在每个MyISAM表上,这将使每个MyISAM上的读/写I/O增加20-25%,而不会更改任何其他内容。再说一遍,代价是什么?在大多数情况下,这张桌子的大小将翻一番。我以前写过关于MyISAM性能增强/权衡的文章:

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/20745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档