在我们的生产数据库中,我们运行以下每小时运行的伪代码SQL批处理查询:
INSERT INTO TemporaryTable
(SELECT FROM HighlyContentiousTableInInnoDb
WHERE allKindsOfComplexConditions are true)
Run Code Online (Sandbox Code Playgroud)
现在这个查询本身并不需要很快,但我注意到它是锁定的HighlyContentiousTableInInnoDb,即使它只是从它读取.其他一些非常简单的查询需要大约25秒(这是其他查询需要多长时间).
然后我发现在这种情况下InnoDB表实际上是被SELECT锁定的!http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/
但我真的不喜欢选择OUTFILE的文章中的解决方案,它似乎是一个黑客(文件系统上的临时文件看起来很糟糕).还有其他想法吗?有没有办法制作InnoDB表的完整副本,而不会在复制过程中以这种方式锁定它.然后我可以将其复制HighlyContentiousTable到另一个表并在那里进行查询.