在 MySQL table 上创建外键需要永远复制到 tmp table
Create foreign key on MySQL table takes forever with copy to tmp table
我正在尝试在具有 30M+ 行的 5.7 InnoDB
table 上设置外键约束。
它现在已经在四核 64GB 服务器上运行了 45 分钟。 processlist 为发出的 alter table 命令输出状态 copy to tmp table
。
InnoDB_buffer_pool_size
设置为32G还有空间
为什么系统会创建一个 tmp
table 并且可以以某种方式提高性能?
很可能正在为该外键建立索引。如果您已经有一个索引,其中外键列是索引的最左边的列,那么它将使用该索引而不是构建一个新索引。
45 分钟听起来不像是在如此大的 table 上构建索引的不寻常时间。您还没有说明外键列的数据类型是什么,所以它可能是一个大的 varchar 或其他东西,并且它需要很多千兆字节来构建该索引。
可能是你服务器的磁盘太慢了。如果您使用的是非 SSD 存储或远程存储(如 Amazon EBS),以现代标准来看速度很慢。
CPU 内核不会产生任何影响,因为无论如何工作都是在一个线程中完成的。更快的 CPU 速度会有所帮助,但不是更多的内核。
在我的公司,我们使用 pt-online-schema-change 来应用所有架构更改或索引构建。这允许客户端同时读取和写入 table,因此花费 45 分钟或 90 分钟甚至更长时间都无关紧要。最终它完成了,并将新的 table 换成了旧的 table.
注意!这会禁用密钥检查,因此知道您在做什么,在某些情况下不推荐这样做,但可以帮助很多人,所以我认为值得回答。
我这周遇到了这个问题,我有一个客户仍然有 mySQL 5.5,所以我必须让它工作。您只需要禁用密钥检查,以及将您的应用程序关闭以进行维护(这样您就没有任何操作)。
在创建 FK 或添加列之前,请使用:
ALTER TABLE table_name DISABLE KEYS;
然后运行你的命令,我的table1M行只用了57秒。
那你运行:
ALTER TABLE table_name ENABLE KEYS;
我正在尝试在具有 30M+ 行的 5.7 InnoDB
table 上设置外键约束。
它现在已经在四核 64GB 服务器上运行了 45 分钟。 processlist 为发出的 alter table 命令输出状态 copy to tmp table
。
InnoDB_buffer_pool_size
设置为32G还有空间
为什么系统会创建一个 tmp
table 并且可以以某种方式提高性能?
很可能正在为该外键建立索引。如果您已经有一个索引,其中外键列是索引的最左边的列,那么它将使用该索引而不是构建一个新索引。
45 分钟听起来不像是在如此大的 table 上构建索引的不寻常时间。您还没有说明外键列的数据类型是什么,所以它可能是一个大的 varchar 或其他东西,并且它需要很多千兆字节来构建该索引。
可能是你服务器的磁盘太慢了。如果您使用的是非 SSD 存储或远程存储(如 Amazon EBS),以现代标准来看速度很慢。
CPU 内核不会产生任何影响,因为无论如何工作都是在一个线程中完成的。更快的 CPU 速度会有所帮助,但不是更多的内核。
在我的公司,我们使用 pt-online-schema-change 来应用所有架构更改或索引构建。这允许客户端同时读取和写入 table,因此花费 45 分钟或 90 分钟甚至更长时间都无关紧要。最终它完成了,并将新的 table 换成了旧的 table.
注意!这会禁用密钥检查,因此知道您在做什么,在某些情况下不推荐这样做,但可以帮助很多人,所以我认为值得回答。
我这周遇到了这个问题,我有一个客户仍然有 mySQL 5.5,所以我必须让它工作。您只需要禁用密钥检查,以及将您的应用程序关闭以进行维护(这样您就没有任何操作)。 在创建 FK 或添加列之前,请使用:
ALTER TABLE table_name DISABLE KEYS;
然后运行你的命令,我的table1M行只用了57秒。
那你运行:
ALTER TABLE table_name ENABLE KEYS;