每次我使用 MySQL 的 CREATE TABLE AS SELECT ...
时,从中选择的所有表/索引都在查询期间锁定。我真的不明白为什么?有什么办法解决这个问题吗?
使用: MySQL 5.1.41
和 InnoDB
添加示例:
例如,以下查询最多可能需要 10 分钟才能完成:
CREATE TABLE temp_lots_of_data_xxx AS
SELECT
a.*
b.*
c.*
FROM a
LEFT JOIN b ON a.foo = b.foo
LEFT JOIN c ON a.foo = c.foo
在上述查询期间尝试更新表 a、b 或 c 中的值将等待上述查询先完成。我想避免这种锁定,因为我对创建的临时表中最完整的数据不感兴趣。
附注SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
不会产生任何行为变化。
最佳答案
另见 http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/
如果不使用复制,可以更改 innodb_locks_unsafe_for_binlog 来更改此锁定行为。
或者可以将数据转储到文件中,然后从文件中重新加载数据。这也避免了锁。
关于MySQL 创建表为 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715580/