【发布时间】:2011-02-08 02:43:08
【问题描述】:
在我们的生产数据库中,我们每小时运行以下伪代码 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 的解决方案,这似乎是一种 hack(文件系统上的临时文件看起来很糟糕)。还有其他想法吗?有没有办法制作 InnoDB 表的完整副本,而不会在复制过程中以这种方式锁定它。然后我可以将HighlyContentiousTable 复制到另一个表并在那里进行查询。
【问题讨论】:
-
我这里没有问,但是我还没有找到方法。我正在使用 outfile 来防止我的查询需要 20 分钟的锁定时间:)
-
有谁知道这个问题在 MySQL 5.1 中是否真的如文章所暗示的那样得到了解决?
-
不,MySQL 5.1.44——同样的问题
-
请提供
SHOW CREATE TABLE TemporaryTable;可能有一些事情不必要地延长了锁定时间。另外,让我们看看条件和SHOW CREATE TABLE HighlyContentiousTableInInnoDb;有办法显着提高SELECT的速度。 -
@Ryan,您必须在赏金消息中输入这么多文本这一事实是一个强烈的指标,您应该创建一个新问题(并可能链接到此问题以供参考)。可通过right there in the manual 获取分步过程。
标签: mysql select insert locking innodb