MySQL Alter huge table(更改字段类型)

标签 mysql performance

所以我有一个包含 4 016 515 759 行的表格。我需要将我的 address_id 字段的字段类型从 int 更改为 bigint,它也是一个 FOREIGN KEY

我刚刚测试了这个查询:

SET foreign_key_checks = 0;
ALTER TABLE `my_table` CHANGE address_id address_id bigint;

在具有 6 845 016 行的本地表上 - 需要 14 分钟。我猜生产这 40 亿行需要很长时间。

所以问题是:如何真正快速安全地更新这个?或者我应该复制 my_table 并在此副本上执行 ALTER 然后重命名它吗?

因为停机时间会很长。

最佳答案

编辑:这可能是引擎特定的。

更改具有外键的常用表中的列......你正在进入一个伤害我的 friend 的世界。

如果您在当时实际使用的环境中执行此操作,则整个表将被锁定,直到您的更改完成。为锁定等待超时甚至最大连接错误做好准备。根据您的情况,仅几分钟的变化可能意味着停机。

有些人巧妙地解决了这个问题:

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

请务必阅读有关外键的部分。

所以...

我个人的方法是避免这样的事情,并试图通过扩大任何可能变得太小和太重要的字段来防止它。所有数字主键等上的无符号双整数。

不过,偶尔,其他人只是踢了一个巨大的变更表,一切都堵塞了,我们达到了最大连接数。很难防止这种情况发生,因为测试不会那么失败:一个简单的测试环境没有那么多流量。

问题是:不可避免的 mysql 重启往往会立即用新结构恢复表。

简短版:

  • 计划停机时间
  • 通过关闭内容来最大程度地减少客户查询
  • 运行修改表
  • 当你开始感到无聊时重启 MySQL

关于MySQL Alter huge table(更改字段类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22838998/

相关文章:

mysql - 按两个字段排序 - 索引

python - 将 numpy 数组写入文本文件的速度

性能优势 - 多个 PowerShell 与后台作业

javascript - 使用哪种算法来确定坐标是否在特定区域内?

mysql - 需要帮助使用局部变量减去具有多个组的前一行值

php - codeigniter 事件记录数据库查询

mysql - ShoreTel MySQL 查询

php - 从表 MYSQL 中获取所有 id

Javascript 内存消耗与大集合和回调上的 map()

c++ - 产品/消费者——什么是最佳信号模式