微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 MySQL 表上创建外键需要永远复制到 tmp 表

如何解决在 MySQL 表上创建外键需要永远复制到 tmp 表

我正在尝试在具有 30M+ 行的 5.7 InnoDB 表上设置外键约束。

它现在已经在四核 64GB 服务器上运行了 45 分钟。 processlist 为发出的 alter table 命令输出状态 copy to tmp table

InnoDB_buffer_pool_size 设置为 32G 并且有空间。

为什么系统会创建一个 tmp 表,这能以某种方式提高性能吗?

解决方法

为该外键构建索引可能需要花费时间。如果您已经有一个索引,其中外键列是索引最左边的列,那么它将使用该索引而不是构建一个新索引。

45 分钟在如此大的表上建立索引的时间听起来并不稀奇。您还没有说明外键列的数据类型是什么,所以它可能是一个很大的 varchar 或其他东西,并且它需要很多 GB 来构建该索引。

也许你的服务器磁盘太慢了。如果您使用的是非 SSD 存储或远程存储(如 Amazon EBS),按照现代标准,它会很慢。

CPU 内核不会产生任何影响,因为无论如何工作都是在一个线程中完成的。更快的 CPU 速度会有所帮助,但不会有更多的内核。

在我的公司,我们使用 pt-online-schema-change 来应用所有架构更改或索引构建。这允许客户端同时读取和写入表,因此需要 45 分钟或 90 分钟甚至更长的时间都没有关系。最终它完成,并将新表替换为旧表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。