说我有一个大表,20万行,我需要更改/添加枚举类型的列,它会正常工作还是会遇到问题?我应该避免使用枚举吗?例如头发颜色:说我有黑色和棕色,但20万行后我决定添加金发。 (这些是有很多条件的领域,查找成员)
应该将电子邮件字段设为varchar(255)?
ID应该始终是无符号的bigint吗?
我基本上试图优化一两件事。
编辑:我预计用户数不会超过30万,我只是想知道其他表中的用户ID和相关ID的mediumint vs int或bigint是否会有明显的性能提升?答案 0 :(得分:2)
enum对于头发颜色等有限的选择并不是一个坏主意,频繁更新到小表(如200k行)并不痛苦
电子邮件地址的最大长度为320个字符。 - source
未签名是的,如果你想要auto_increment,那么无符号是 Big int 的方法吗?如果你的桌子少于1百万,你可以设置比它低得多
答案 1 :(得分:0)
200,000并不是那么大。在较小的表上执行ALTER TABLE应该没有问题。
这就是我通常使用的
我认为你的意思是主键 - 无符号bigint会为你的主键提供相当大的数字。显然,使用更大的数据类型会占用更多的磁盘空间,但只有200,000条记录,它根本不会引起注意。
答案 2 :(得分:0)
在MySQL 5.1 +中(请确认),更新ENUM类型的ALTER TABLE将只更改表定义IFF - 旧枚举值的顺序不会改变,并且最后添加新的枚举值。因此,即使有数百万行,也不会花费任何额外的时间。
详细说明 -
如果你有一个专栏
Color ENUM('Red', 'White');
你可以像这样添加蓝色 -
ALTER TABLE <tableName> MODIFY Colour ENUM('Red', 'White', 'Blue');
你很高兴。
但要注意,如果你像这样修改它
..ENUM('Blue', 'Red', 'White');
它将最终更新表中的每一行,因为现在您已经更改了旧枚举文字的索引值(索引值是MySQL在行中存储的内容)。