• 为标识列(identifier column) 选择合适的数据类型非常重要。一般来说更有可能用标识列与其他值进行比较(例如,在关联操作中),或者通过标识列寻找其他列。标识列也可能在另外的表中作为外键使用,所以为标识列选择数据类型时,应该选择跟关联表中的对应列一样的类型。
    • 在可以满足值的范围的需求,井且预留未来增长空间的前提下,应该选择最小的数据类型。
    • 整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT。
    • 对千标识列来说, EMUM 和SET 类型通常是一个糟糕的选择。
    • 应该避免使用字符串类型作为标识列,因为它们很消耗空间,并且通常比数字类型慢。
      • 尤其是在MyISAM 表里使用字符串作为标识列时要特别小心。MylSAM 默认对字符串使用压缩索引,这会导致查询慢得多。
      • 对于完全”随机”的字符串也需要多加注意,例如MDS( )、SHAl( )或者UUID( )产生的字符串。这些函数生成的新值会任意分布在很大的空间内,这会导致INSERT 以及一些SELECT 语句变得很慢注 :因为插入值会随机地写到索引的不同位置,所以使得INSERT 语句更慢。
        • 这会导致页分裂、磁盘随机访问,以及对千聚簇存储引擎产生聚簇索引碎片。
        • SELECT 语句会变得更慢,因为逻辑上相邻的行会分布在磁盘和内存的不同地方。
        • 随机值导致缓存对所有类型的查询语句效果都很差,因为会使得缓存赖以工作的访问局部性原理失效。如果整个数据集都一样的“热”,那么缓存任何一部分特定数据到内存都没有好处;如果工作集比内存大,缓存将会有很多刷新和不命中。
      • 如果存储UUID 值,则应该移除“-”符号;或者更好的做法是,用UNHEX( )函数转换UUID 值为16 字节的数字,井且存储在一个BINARY(16) 列中。检索时可以通过UNHEX()函数来格式化为十六进制格式。UUID( )生成的值与加密散列函数例如SHAl( )生成的值有不同的特征: UUID 值虽然分布也不均匀,但还是有一定顺序的。尽管如此,但还是不如递增的整数好用。