MySQL 创建表为 SELECT

标签 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

在上述查询期间尝试更新表 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/

相关文章:

mysql - 2个外键在MySQL中引用同一个主键

c# - .NET Entity Framework Core 2.0 - 代码优先 - 意外的表关系结果

php - 使用php连接远程mysql数据库的问题

sql - 具有类型字符的列的总和值

mysql - 从MySql读取utf-8字符到C变量中

php - 如何检测数据库结构是否发生变化? (不是内容!)

python - MYSQL 语句中的动态表名 (Google Cloud SQL)

mysql - 左连接似乎极大地阻碍了 SQL 查询性能

mysql - 与 MySQL 5.1 的 ODBC 连接

mysql - 将数据从mssql迁移到mysql的问题