如何在不锁定表的情况下始终对MySQL MyISAM数据库执行插入操作?
当我加载100,000条记录时,我的其他进程似乎被锁定了。
基本上,我可以强制使用concurrent_inserts=2吗,即使表中有洞,这样在插入过程中就不会有表锁定?
可以为会话动态设置concurrent_inserts吗?请参阅http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html
对于非锁定插入,还有哪些其他方法?
"insert delayed“会在插入期间阻止表锁定吗?请参阅http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html
发布于 2012-07-23 22:57:03
如果您以小批的方式执行插入,使用INSERT DELAYED将使从表中选择的客户端基本上获得第一优先级,这样它们就不会阻塞。如果一次插入数千行,可能会将表锁定一段时间。另一件有助于加快插入速度的事情是临时告诉DB跳过唯一检查。这将阻止对任何唯一键的持续分析,但不会阻止表的锁定。您必须确保您插入的内容是唯一的。
在执行多次插入时,InnoDB通常是更好的选择,因为它将锁定行,而不是表。您的插入将花费更长的时间,但是您的客户端将看到更好的并发性能。
发布于 2013-05-02 21:10:24
我也遇到过同样的问题。我尝试将2500,000条记录插入到一个MyISAM表中。它是一个独立的表,所以锁不会让我担心。但是插入过程只是冻结了整个数据库服务器。
所以我做了什么:
就这样。
发布于 2012-07-23 22:57:11
IIRC MyISAM在任何插入操作发生时锁定表。只需重新阅读并确认:
为了实现非常高的锁定速度,MySQL对除InnoDB、BDB和
之外的所有存储引擎都使用表锁定(而不是页、行或列锁定
摘自:http://dev.mysql.com/doc/refman/5.0/en/table-locking.html
如果你知道任何非锁定的MyISAM插件,请让我知道--因为这是我每天都要面对的问题(我不喜欢InnoDB的空间消耗和速度)
https://stackoverflow.com/questions/11614616
复制相似问题