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

Most Efficient Data Type for Fixed Length Column

我正在设计我的数据库结构。

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

因此我想知道:

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

使用VARCHAR,不用担心。

只有当您处理的数据太多以至于单个驱动器装不下时,或者即便如此,单个服务器塞满了驱动器时,这才是一个问题。

管理具有数十亿行的数据库的公司在这方面有问题,但在你变得那么大之前你不会。

简短回答:正如 tadman 所说:“使用 VARCHAR,不用担心它”

长答案:

列消耗的 space 是 space 和速度的主要因素。

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

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

固定长度 VARCHARCHAR 之间的区别在于实际字符串之前的 1 或 2 字节长度字段。除非你有数十亿行,否则这是 'not a big deal'.

处理速度差别不大,但CHARascii胜出。

如果你有全数字字符串,你可能想要使用INT 4字节或BIGINT 8字节或DECIMAL(30) 14字节等——而不是使用 CHARVARCHAR,每个数字有 1 个字节。数字字段都是固定长度的。不过要小心。美国 phone 号码是固定长度的,但国际号码会有所不同。

你暗示除了"alphanumeric"还有别的东西。如果你指的是BINARY/VARBINARY/BLOB,那么规则基本相同。

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

对于整数,总是考虑 BIGINT vs INT vs MEDIUMINT vs SMALLINT vs TINYINT,通常会考虑 UNSIGNED。 (它们分别占用 8/4/3/2/1 个字节。)在最初创建 table 时执行此操作;以后做一个ALTER很乱。