任何数据库都使用VARCHAR作为ID发出问题

问题描述 投票:0回答:2

我正在构建一个数据库,并希望将VARCHAR用作某些表的ID /主键,因此它更加用户友好。我知道历史上存在系统限制/减速,所以使用尽可能小的数据类型是很好的做法。

使用当前的系统硬件,这有变化吗?我的意思是,我们是否仍然应该使用小数据类型或者这是过去的事情吗?

谢谢,

mysql sql database
2个回答
2
投票

它不是世界末日。但由于以下原因,VARCHAR()不鼓励使用主键:

  • 它们通常比整数占用更多的空间。这在主表中几乎没有区别,但是外键使用的空间使用量是相乘的。
  • 它们(通常)是可变长度的。这会给索引带来轻微的开销。不多,但为什么要这么麻烦?
  • 它们(通常)没有订购。该表按主键排序,因此增加了页面拆分和碎片的可能性。
  • 他们可能会改变。我只是发现级联外键关系是数据模型中的一个坏标志。

我建议使用自动递增的主键,在varchar()列上使用唯一索引,并使用主键使用所有外部引用。


0
投票

考虑@ GordonLinoff的补充答案。

虽然您所陈述的字符串索引的示例是合理的,但您应该知道:

  • 索引VARCHAR(X)相当于索引CHAR(X),因为索引中的条目是不变的。
  • 在utf8 / utf8mb4归类中索引字符串类型意味着长度分别为3X或4X。

因此,如果要索引utf8mb4 VARCHAR(255)列,每个条目将需要大约1kB的索引空间/内存。 [受key length constraints的影响,可能多于或少于此。]

一个并不比另一个更好,因为你需要做出权衡。代理键可以使索引大小保持较小,但需要额外的应用程序逻辑。自然键使用起来更自然,但通常需要更多的索引空间。

© www.soinside.com 2019 - 2024. All rights reserved.