固定长度列的最高效数据类型
Most Efficient Data Type for Fixed Length Column
我正在设计我的数据库结构。
有许多列是固定长度的,至少其中一列是纯字母数字。
因此我想知道:
- 一般来说,固定长度列最有效的数据类型是什么?
- 固定长度字母数字列的最有效数据类型是什么?
- 为什么?
使用VARCHAR
,不用担心。
只有当您处理的数据太多以至于单个驱动器装不下时,或者即便如此,单个服务器塞满了驱动器时,这才是一个问题。
管理具有数十亿行的数据库的公司在这方面有问题,但在你变得那么大之前你不会。
简短回答:正如 tadman 所说:“使用 VARCHAR,不用担心它”
长答案:
列消耗的 space 是 space 和速度的主要因素。
可以声明真正固定长度的字符串CHAR(..)
。通常,它们仅由 ascii 字符组成,因此 'right' 方法是,例如
country_code CHAR(2) CHARACTER SET ascii
uuid CHAR(36) CHARACTER SET ascii
固定长度 VARCHAR
与 CHAR
之间的区别在于实际字符串之前的 1 或 2 字节长度字段。除非你有数十亿行,否则这是 'not a big deal'.
处理速度差别不大,但CHAR
和ascii
胜出。
如果你有全数字字符串,你可能想要使用INT
4字节或BIGINT
8字节或DECIMAL(30)
14字节等——而不是使用 CHAR
或 VARCHAR
,每个数字有 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
很乱。
我正在设计我的数据库结构。
有许多列是固定长度的,至少其中一列是纯字母数字。
因此我想知道:
- 一般来说,固定长度列最有效的数据类型是什么?
- 固定长度字母数字列的最有效数据类型是什么?
- 为什么?
使用VARCHAR
,不用担心。
只有当您处理的数据太多以至于单个驱动器装不下时,或者即便如此,单个服务器塞满了驱动器时,这才是一个问题。
管理具有数十亿行的数据库的公司在这方面有问题,但在你变得那么大之前你不会。
简短回答:正如 tadman 所说:“使用 VARCHAR,不用担心它”
长答案:
列消耗的 space 是 space 和速度的主要因素。
可以声明真正固定长度的字符串CHAR(..)
。通常,它们仅由 ascii 字符组成,因此 'right' 方法是,例如
country_code CHAR(2) CHARACTER SET ascii
uuid CHAR(36) CHARACTER SET ascii
固定长度 VARCHAR
与 CHAR
之间的区别在于实际字符串之前的 1 或 2 字节长度字段。除非你有数十亿行,否则这是 'not a big deal'.
处理速度差别不大,但CHAR
和ascii
胜出。
如果你有全数字字符串,你可能想要使用INT
4字节或BIGINT
8字节或DECIMAL(30)
14字节等——而不是使用 CHAR
或 VARCHAR
,每个数字有 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
很乱。