一、选择标识符 (identifier)

为标识列 (identifier column)选择合适的数据类型非常重要。一般来说更有可能用标识列与其他列进行比较,或者通过标识列寻址其他列。标识列也有可能在另外的表中作为外键,所以在外标识列选择数据类型时,应该选择跟关联表中的对应列一样的类型。

当选择标识列的类型时,不仅仅要考虑存储类型,还要考虑 MySQL 对这种类型怎么执行计算和比较。例如,MySQL 在内部使用 SUM 和 SET 类型,然后比较操作时转换为字符串。

一旦选定了一种类型,要确保在所以关联表中都要使用同样的类型。类型之间需要精确匹配,包括像 UNSIGNED 这样的属性。混用不同数据类型可能导致性能问题,即使没用影响,在比较操作时可能因为隐式类型转换导致很难发现的错误。

在可以满足值的范围需求,并且预留未来增长空间的前提下,应该选择最小的数据类型。下面是一些小技巧:

整数类型

整数通常是标识列最好的选择,因为它们很快并且可以使用 AUTO_INCREMENT。

EMUM 和 SET 类型

对于标识列来说,EMUM和 SET 类型通常是一个糟糕的选择,更适合存储固定信息,比如有序的状态,人的性别等。

字符串类型

应该尽量避免使用字符串类型作为标识列,因为他们非常消耗空间,并且通常比数字类型慢。尤其是在 MyISAM 表里使用字符串作为标识符时要特别小心,MyISAM 表默认对字符串使用压缩索引,这会导致查询慢得多。

二、特殊类型数据

某些类型的数据并不直接与内置类型一致。低于秒级精度的时间戳就是一个例子。

另一个例子是一个 IPv4 地址。经常使用 VARCHAR(15) 来存储 IP 地址。然而,它们实际上是 32 位无符号整数,不是字符串。用小数点将地址分成四段的表示方法只是为了让人们容易阅读。所以应该使用无符号整数存储 IP 地址。MySQL 提供了 INET_ATON() 和 INET_NTOA() 函数在这两种方法之间转换。