任何使用varchar作为id的数据库问题

3z6pesqy  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(596)

我正在构建一个数据库,并希望使用varchar作为某些表的id/主键,这样更方便用户。我知道历史上存在系统限制/减速,因此使用尽可能小的数据类型是很好的做法。
在当前的系统硬件中,这种情况发生了变化吗?我是说,我们应该继续练习使用小数据类型吗?还是这已经成为过去了?
谢谢,

chhqkbe1

chhqkbe11#

这不是世界末日。但是 VARCHAR() 不鼓励使用主键,原因如下:
它们通常比整数占据更多的空间。这在主表中没有什么区别,但是外键引用的空间使用率会成倍增加。
它们(通常)是可变长度的。这给索引增加了一点开销。不多,但为什么要麻烦呢?
它们(通常)没有被订购。表是按主键排序的,因此这增加了页分裂和碎片的可能性。
他们可能会改变。我只是发现级联外键关系在数据模型中是一个不好的迹象。
我建议使用自动递增的主键,在 varchar() 列,以及使用主键的所有外部引用。

dauxcl2d

dauxcl2d2#

把这个答案看作是对@gordonlinoff的补充。
虽然您所陈述的要编制索引的字符串示例是合理的,但您应该知道:
索引a VARCHAR(X) 相当于索引 CHAR(X) 因为索引中的条目是常量。
在utf8/utf8mb4排序规则中索引字符串类型意味着长度分别是3x或4x。
所以如果你要索引一个utf8mb4 VARCHAR(255) 列每个条目大约需要1kb的索引空间/内存[受制于密钥长度限制,可能大于或小于此限制。]
一个并不一定比另一个好,因为无论哪种方式,你都必须做出权衡。代理键可以使索引大小保持较小,但需要附加的应用程序逻辑。自然键使用起来更自然,但通常需要更多的索引空间。

相关问题