关于规划mysql表的几个问题

时间:2011-01-11 12:30:41

标签: mysql

  1. 说我有一个大表,20万行,我需要更改/添加枚举类型的列,它会正常工作还是会遇到问题?我应该避免使用枚举吗?例如头发颜色:说我有黑色和棕色,但20万行后我决定添加金发。 (这些是有很多条件的领域,查找成员)

  2. 应该将电子邮件字段设为varchar(255)?

  3. ID应该始终是无符号的bigint吗?

  4. 我基本上试图优化一两件事。

    编辑:我预计用户数不会超过30万,我只是想知道其他表中的用户ID和相关ID的mediumint vs int或bigint是否会有明显的性能提升?

3 个答案:

答案 0 :(得分:2)

  1. enum对于头发颜色等有限的选择并不是一个坏主意,频繁更新到小表(如200k行)并不痛苦

  2. 电子邮件地址的最大长度为320个字符。 - source

  3. 未签名是的,如果你想要auto_increment,那么无符号是 Big int 的方法吗?如果你的桌子少于1百万,你可以设置比它低得多

答案 1 :(得分:0)

  1. 200,000并不是那么大。在较小的表上执行ALTER TABLE应该没有问题。

  2. 这就是我通常使用的

  3. 我认为你的意思是主键 - 无符号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在行中存储的内容)。