MySQL创建表作为SELECT

clo*_*ops 15 mysql database

每次我使用MySQL时,CREATE TABLE AS SELECT ...所有选择的表/索引都会在查询期间锁定.我真的不明白为什么?有没有办法解决?

使用: MySQL 5.1.41InnoDB

添加示例:

例如,以下查询最多可能需要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以更改此锁定行为.

或者可以将数据转储到文件,然后从文件重新加载数据.这也避免了锁.


ype*_*eᵀᴹ 6

您是否尝试过两个阶段(首先创建表,然后插入值)并设置最低隔离级别?

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)