如何在不锁定表的情况下始终插入MySQL MyISAM数据库?
当我加载100000条记录时,我的其他进程似乎被锁定了。
基本上,我可以强制使用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
如果您以小批量执行插入,使用INSERT DELAYED将使从表中选择的客户端基本上获得第一优先级,这样它们就不会阻塞。如果在一个快照中插入数千行,则可能会锁定该表一段时间。另一件有助于加快插入速度的事情是临时告诉DB跳过唯一检查。这将阻止对任何唯一密钥的持续分析,但不会阻止表的锁定。您必须确信您插入的内容是唯一的。
在进行多次插入时,InnoDB通常是更好的选择,因为它会锁定行而不是表。您的插入将花费更长的时间,但您的客户端将看到更好的并发性能。
我也遇到过同样的问题。我试图在MyISAM表中插入2500000条记录。它是一个独立的表,所以锁不会让我担心。但插入过程只是冻结了整个数据库服务器。
所以我做了什么:
- 删除所有INDEX(在过程结束时添加这些)
- 每次插入2500行
- 使用INSERT DELAYED INTO
就是这样。
IIRC MyISAM在发生任何插入时锁定表。。只是重新阅读并确认:
为了实现非常高的锁定速度,MySQL使用表锁定(页、行或列锁定的)InnoDB、BDB和NDBCLUSTER
取自:http://dev.mysql.com/doc/refman/5.0/en/table-locking.html
如果你知道任何非锁定的MyISAM插入,请告诉我-因为这是我每天都要面对的问题(我不喜欢InnoDB空间消耗和速度)
MySQL确实支持MyISAM表在同一个表中并行插入。
MyISAM
MySQL对MyISAM、MEMORY和MERGE表使用表级锁定,一次只允许一个会话更新这些表,使它们更适合只读、只读或单用户应用程序。
但是,MyISAM表的上述行为可以通过concurrent_insert系统变量进行更改,以实现并发写入。根据您的要求,可以将属性的值设置为1
或2
。有关详细信息,请参阅链接。
因此,事实上,MySQL确实支持InnoDB和MyISAM存储引擎的并发插入。