固定长度列的最有效数据类型



我只是在设计我的数据库结构。

有许多列是固定长度的,其中至少一列是纯字母数字。

因此我想知道:

  1. 一般来说,固定长度列最有效的数据类型是什么?
  2. 固定长度字母数字列最有效的数据类型是什么?
  3. 为什么?

简短回答:正如塔德曼所说:"使用 VARCHAR 不要担心">

长答案:

色谱柱占用的空间是空间和速度的主要因素。

真正的固定长度字符串可以声明为CHAR(..)。 通常,它们仅由ASCII字符组成,因此"正确"的方法是,例如

country_code CHAR(2) CHARACTER SET ascii
uuid CHAR(36) CHARACTER SET ascii

固定长度VARCHAR而不是CHAR之间的区别在于实际字符串前面的 1 字节或 2 字节长度字段。 除非您有数十亿行,否则这"没什么大不了的"。

处理速度差异微不足道,但CHARascii获胜。

如果你有全数字字符串,你可能希望使用INT4 字节或BIGINT8 字节或DECIMAL(30)14 字节等 - 而不是使用CHARVARCHAR,每个数字有 1 个字节。 数值字段均为固定长度。 但是,要小心。 美国电话号码是固定长度的,但国际号码各不相同。

你暗示除了"字母数字"之外还有其他东西。 如果您指的是BINARY/VARBINARY/BLOB,那么规则大多相同。

例如,可以通过合适的转换将 uuid 从CHAR(36)(36 字节(缩小到BINARY(16)(16 字节(。 后者在速度和空间方面更好,但它增加了代码的复杂性。 (无论如何,uuids对于巨大的桌子来说是可怕的;这是另一个话题。

对于整数,始终考虑BIGINTvsINTvsMEDIUMINTvsSMALLINTvsTINYINT,并且通常附加UNSIGNED。 (它们分别占用 8/4/3/2/1 字节。 在最初创建表时执行此操作;以后做ALTER很乱。

使用VARCHAR,不用担心。

仅当您处理如此多的数据时,这才是一个问题,它无法容纳在单个驱动器上,或者即使这样,单个服务器也会卡满驱动器。

管理具有数十亿行的数据库的公司对此有问题,但直到你那么大,你才会这样做。

最新更新