一尘不染

如何提高INSERT INTO…SELECT锁定行为

mysql

在生产数据库中,我们每小时运行以下伪代码SQL批查询:

INSERT INTO TemporaryTable
    (SELECT FROM HighlyContentiousTableInInnoDb
     WHERE allKindsOfComplexConditions are true)

现在,此查询本身并不需要很快,但是我注意到它已经被锁定HighlyContentiousTableInInnoDb,即使它只是从中读取。这使得其他一些非常简单的查询需要大约25秒(这是其他查询所花费的时间)。

然后我发现InnoDB表实际上是由SELECT锁定的!https://www.percona.com/blog/2006/07/12/insert-
into-select-performance-with-innodb-
tables/

但是我真的不喜欢选择OUTFILE的文章中的解决方案,它看起来像是一种黑客(文件系统上的临时文件似乎很烂)。还有其他想法吗?有没有一种方法可以在不复制InnoDB表的情况下将其锁定。然后,我可以将其复制HighlyContentiousTable到另一个表并在那里进行查询。


阅读 341

收藏
2020-05-17

共1个答案

一尘不染

现在,此问题的答案要容易得多:-使用基于行的复制和读取提交隔离级别。

您遇到的锁定消失了。

更长的解释:http : //harrison-fisk.blogspot.com/2009/02/my-favorite-
new-feature-of-mysql-51.html

2020-05-17