Ami*_*mit 5 mysql enums alter-table rds downtime
我想更新 RDS Mysql 中的枚举并向列添加值。我想更新同一个表中存在大量数据。我假设在更新表的架构时,表被锁定,这显然涉及停机时间,在此期间我的服务将停止运行。我的MysqlServer版本是5.5.40。
但是,当我向 Enum 添加值时,RDS Mysql 服务器是否足够智能,可以检测到它不需要扫描现有行并在执行简单查询时快速更新架构,而无需扫描所有现有行的值枚举列的?
在 Mysql 5.5.46 上,我向现有列表添加了一个新的 ENUM 值:
enum ('a','b','c','d')
Run Code Online (Sandbox Code Playgroud)
到
enum ('a','b','c','d','e')
Run Code Online (Sandbox Code Playgroud)
对于 500k 行,ALTER TABLE CHANGE [column] 花费的时间不到 1 秒。
这似乎是错误:https://bugs.mysql.com/bug.php? id=45567,它似乎在 5.1.40、5.5.0 和 6.0.14 中得到修复
在Mysql 5.6.33上,我尝试过
enum ('a','b','c','d')
Run Code Online (Sandbox Code Playgroud)
到
enum ('a','b','c','e','d')
Run Code Online (Sandbox Code Playgroud)
和 ALTER TABLE CHANGE [column] 没有将现有的 d 更新为 e,如下所述: https: //dba.stackexchange.com/questions/11484/is-it-possible-to-change-enum-lists/11485#11485
我找不到修复此错误的版本。
坏消息,你似乎不走运。
http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
问题在于,更改 ENUM 列的成员列表会使用 ALTER TABLE 重组整个表,这可能会非常耗费资源和时间。如果你有 ENUM('red', 'blue', 'black') 但需要将其更改为 ENUM('red', 'blue', 'white'),MySQL 需要重建你的表并查看每条记录检查现在无效的值“black”。MySQL 确实是愚蠢的,当您所做的只是向成员列表末尾添加新值时,MySQL 甚至会这样做!(有传言说,附加 ENUM 成员列表将来会得到更好的处理,但我怀疑这是一个高优先级的功能。)