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

时间:2018-10-15 20:15:03

标签: mysql phpmyadmin sqldatatypes mysql-5.6

我正处于设计数据库结构的过程中。

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

因此我想知道:

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

2 个答案:

答案 0 :(得分:1)

使用VARCHAR,不用担心。

仅当您处理如此多的数据而无法将其容纳在单个驱动器上,或者甚至是单个服务器卡满了驱动器时,这才是一个问题。

管理具有数十亿行的数据库的公司会遇到此问题,但是只有到那么大时,您才会遇到问题。

答案 1 :(得分:1)

简短的回答:正如塔德曼所说:“使用VARCHAR,不用担心”

长答案:

列占用的空间是空间和速度的主要因素。

可以将完全定长的字符串声明为CHAR(..)。通常,它们仅由ASCII字符组成,因此例如,“正确”的实现方法是

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

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

处理速度差异不明显,但是CHARascii赢了。

如果您使用全数字字符串,则可能要使用INT 4个字节或BIGINT 8个字节或DECIMAL(30) 14个字节,等等-而不是使用CHARVARCHAR,后者将每位1字节。数字字段均为固定长度。不过要小心。美国电话号码的长度是固定的,但是国际电话号码是固定的。

您暗示除“字母数字”外还有其他内容。如果您指的是BINARY / VARBINARY / BLOB,则规则基本相同。

例如,可以通过适当的转换将uuid从CHAR(36)(36字节)缩减为BINARY(16)(16字节)。后者在速度和空间上更好,但是却增加了代码的复杂性。 (无论如何,uuid对于巨大的表是可怕的;这是另一个主题。)

对于整数,请始终考虑BIGINT vs INT vs MEDIUMINT vs SMALLINT vs TINYINT,通常使用UNSIGNED。 (它们分别占用8/4/3/2/1个字节。)在最初创建表时执行此操作;稍后再进行ALTER会很麻烦。