2012-07-23 57 views
1

我该怎么做总是在不锁定表的情况下插入MySQL MyISAM数据库?MySQL MyISAM - Do not insert without lock

当我加载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

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

在做很多插入操作时,InnoDB往往是更好的选择,因为它会锁定行而不是表。您的插入需要更长的时间,但您的客户将看到更好的并发性能。

0

IIRC的MyISAM表锁,而任何插入偏偏..只要重新读取并确认:

达到了非常高的速度锁,MySQL使用表锁定(页,而不是 ,行或列锁定)的所有存储引擎,除了 的InnoDB,BDB和NDBCLUSTER

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

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

+0

检出[并发插入](http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html)。 – 2012-07-23 14:58:20

+0

我不确定这是否适合我的问题 - 基本上我有一个巨大的myisam表和许多独立运行的插入线程(非常差的应用程序设计,其中插入是单个记录,而不是分成块)。每个线程似乎都被阻塞,直到前一个线程执行插入。我会重新阅读你的链接,看看它确实解决了我的问题。感谢您的链接。 – FreudianSlip 2012-07-23 15:01:21

+0

并发插入仅防止阻塞SELECT。其他INSERT仍将被阻止(您不能同时向同一文件的末尾写入两个单独的请求)。 – 2012-07-23 16:21:54

1

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

所以我做了什么:

  • 删除所有的INDEX-ES
  • 做每个刀片有2500行
  • 使用INSERT DELAYED INTO
(在过程的末尾添加这些)

就是这样。

0

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

的MyISAM

MySQL使用对MyISAM,MEMORY表级锁和MERGE表,只允许一个会话在一个时间来更新这些表,使他们更适合只读方式,以读为主或单用户应用程序。

但是,上面提到的MyISAM表格的行为可以被concurrent_insert系统变量改变以实现并发写入。您可以根据您的要求为物业设置价值为12。详情请参阅链接。

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