1

如何在不锁定表的情况下始终插入 MySQL MyISAM 数据库?

当我加载 100,000 条记录时,我的其他进程似乎被锁定。

基本上,即使表中有孔,我是否可以强制使用 concurrent_inserts=2 ,因此在插入期间没有表锁定?

可以为会话动态设置 concurrent_inserts 吗?见http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html

非锁定插入还有哪些其他方法?
“插入延迟”会在插入期间防止表锁定吗?见http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

4

4 回答 4

4

如果您以小批量执行插入,则使用 INSERT DELAYED 将使从表中选择的客户端基本上获得第一优先级,因此它们不会阻塞。如果您一次插入数千行,您可能会锁定表一段时间。可以帮助加快插入速度的另一件事是暂时告诉数据库跳过唯一检查。这将阻止对任何唯一键的持续分析,但不会阻止锁定表。您必须确定您插入的内容是独一无二的。

在进行多次插入时,InnoDB 通常是更好的选择,因为它会锁定行而不是表。您的插入将花费更长的时间,但您的客户会看到更好的并发性能。

于 2012-07-23T14:57:03.027 回答
1

我有同样的问题。我试图将 2,500,000 条记录插入到 MyISAM 表中。这是一张独立的桌子,所以锁并不让我担心。但是插入过程只是冻结了整个数据库服务器。

所以我做了什么:

  • 删除所有 INDEX-es(在过程结束时添加这些)
  • 每次插入 2500 行
  • 使用 INSERT DELAYED INTO

而已。

于 2013-05-02T13:10:24.103 回答
0

IIRC MyISAM 在任何插入发生时锁定表.. 只需重新阅读并确认:

为了实现非常高的锁定速度,MySQL 对除 InnoDB、BDB 和 NDBCLUSTER 之外的所有存储引擎使用表锁定(而不是页、行或列锁定)

取自:http ://dev.mysql.com/doc/refman/5.0/en/table-locking.html

如果您确实知道任何非锁定 MyISAM 插入,请告诉我 - 因为这是我每天都面临的问题(我不喜欢 InnoDB 空间消耗和速度)

于 2012-07-23T14:57:11.357 回答
0

MySQL 确实支持 MyISAM 表在同一个表中的并行插入。

MyISAM

MySQL 对 MyISAM、MEMORY 和 MERGE 表使用表级锁定,一次只允许一个会话更新这些表,使其更适合只读、多读或单用户应用程序。

但是,上面提到的 MyISAM 表的行为可以通过concurrent_insert系统变量来改变,以实现并发写入。您可以将属性的值设置为12,具体取决于您的要求。详情请参阅链接。

因此,事实上,MySQL 确实支持 InnoDB 和 MyISAM 存储引擎的并发插入。

于 2015-09-03T18:34:57.460 回答