MySQL MyISAM - 不插入就插入

时间:2012-07-23 14:31:43

标签: mysql insert locking myisam

如何在不锁定表的情况下始终插入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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

所以我做了什么:

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

就是这样。

答案 2 :(得分:0)

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

  

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

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

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

答案 3 :(得分:0)

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

<强>的MyISAM

MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,一次只允许一个会话更新这些表,使它们更适合于只读,大多数读取或单用户应用程序。 / p>

但是,MyISAM表的上述行为可以通过concurrent_insert系统变量进行更改,以实现并发写入。您可以根据需要将属性的值设置为12。有关详细信息,请参阅链接。

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