每次我使用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
Run Code Online (Sandbox Code Playgroud)
在上述查询期间尝试更新表a,b或c中的值将等待上述查询首先完成.我想避免这种锁,因为我对创建的临时表中最完整的数据不感兴趣.
ps SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
产生的行为没有变化.
bar*_*ter 13
另见 http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/
如果不使用复制,可以更改innodb_locks_unsafe_for_binlog以更改此锁定行为.
或者可以将数据转储到文件,然后从文件重新加载数据.这也避免了锁.
您是否尝试过两个阶段(首先创建表,然后插入值)并设置最低隔离级别?
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
WHERE FALSE
INSERT INTO temp_lots_of_data_xxx
SELECT
a.*
b.*
c.*
FROM a
LEFT JOIN b ON a.foo = b.foo
LEFT JOIN c ON a.foo = c.foo
Run Code Online (Sandbox Code Playgroud)