在我们的生产数据库中,我们每小时运行以下伪代码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/
但我真的不喜欢文章中 Select 外部文件的解决方案,它似乎是一种黑客行为(文件系统上的临时文件似乎很糟糕).还有其他 idea 吗?有没有一种方法可以制作InnoDB表的完整副本,而不必在复制过程中以这种方式锁定它.然后我可以把HighlyContentiousTable
复制到另一个表中,在那里进行查询.