我正在构建一个数据库,并希望使用varchar作为某些表的id/主键,这样更方便用户。我知道历史上存在系统限制/减速,因此使用尽可能小的数据类型是很好的做法。在当前的系统硬件中,这种情况发生了变化吗?我是说,我们应该继续练习使用小数据类型吗?还是这已经成为过去了?谢谢,
chhqkbe11#
这不是世界末日。但是 VARCHAR() 不鼓励使用主键,原因如下:它们通常比整数占据更多的空间。这在主表中没有什么区别,但是外键引用的空间使用率会成倍增加。它们(通常)是可变长度的。这给索引增加了一点开销。不多,但为什么要麻烦呢?它们(通常)没有被订购。表是按主键排序的,因此这增加了页分裂和碎片的可能性。他们可能会改变。我只是发现级联外键关系在数据模型中是一个不好的迹象。我建议使用自动递增的主键,在 varchar() 列,以及使用主键的所有外部引用。
VARCHAR()
varchar()
dauxcl2d2#
把这个答案看作是对@gordonlinoff的补充。虽然您所陈述的要编制索引的字符串示例是合理的,但您应该知道:索引a VARCHAR(X) 相当于索引 CHAR(X) 因为索引中的条目是常量。在utf8/utf8mb4排序规则中索引字符串类型意味着长度分别是3x或4x。所以如果你要索引一个utf8mb4 VARCHAR(255) 列每个条目大约需要1kb的索引空间/内存[受制于密钥长度限制,可能大于或小于此限制。]一个并不一定比另一个好,因为无论哪种方式,你都必须做出权衡。代理键可以使索引大小保持较小,但需要附加的应用程序逻辑。自然键使用起来更自然,但通常需要更多的索引空间。
VARCHAR(X)
CHAR(X)
VARCHAR(255)
2条答案
按热度按时间chhqkbe11#
这不是世界末日。但是
VARCHAR()
不鼓励使用主键,原因如下:它们通常比整数占据更多的空间。这在主表中没有什么区别,但是外键引用的空间使用率会成倍增加。
它们(通常)是可变长度的。这给索引增加了一点开销。不多,但为什么要麻烦呢?
它们(通常)没有被订购。表是按主键排序的,因此这增加了页分裂和碎片的可能性。
他们可能会改变。我只是发现级联外键关系在数据模型中是一个不好的迹象。
我建议使用自动递增的主键,在
varchar()
列,以及使用主键的所有外部引用。dauxcl2d2#
把这个答案看作是对@gordonlinoff的补充。
虽然您所陈述的要编制索引的字符串示例是合理的,但您应该知道:
索引a
VARCHAR(X)
相当于索引CHAR(X)
因为索引中的条目是常量。在utf8/utf8mb4排序规则中索引字符串类型意味着长度分别是3x或4x。
所以如果你要索引一个utf8mb4
VARCHAR(255)
列每个条目大约需要1kb的索引空间/内存[受制于密钥长度限制,可能大于或小于此限制。]一个并不一定比另一个好,因为无论哪种方式,你都必须做出权衡。代理键可以使索引大小保持较小,但需要附加的应用程序逻辑。自然键使用起来更自然,但通常需要更多的索引空间。