【问题标题】:Most Efficient Data Type for Fixed Length Column固定长度列的最有效数据类型
【发布时间】:2019-03-20 07:37:00
【问题描述】:

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

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

因此我想知道:

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

【问题讨论】:

    标签: mysql phpmyadmin sqldatatypes mysql-5.6


    【解决方案1】:

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

    长答案:

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

    真正的定长字符串可以声明为CHAR(..)。很多时候,它们仅由 ascii 字符组成,因此“正确”的做法是,例如

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

    固定长度 VARCHARCHAR 之间的区别在于实际字符串前面的 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 很麻烦。

    【讨论】:

      【解决方案2】:

      使用VARCHAR,不用担心。

      只有当您要处理的数据量如此之大,以至于单个驱动器都装不下,或者即使这样,单个服务器都塞满了驱动器时,这才是一个问题。

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

      【讨论】:

      • 包括一些关于char 的固定长度信息,并将其标记为答案
      • 即使一行有多达27列,您仍然保持相同的位置?
      • 通过提出更优化的架构或使用类似JSON 类型的列而不是一些过宽的行,您将获得更多的性能提升,但在任何case MySQL 通常不在乎或受苦。
      • 如果您对此类性能有疑问,请编写一个脚本,通过插入 N 百万行来测试您的系统,看看它是如何维持的。您的提供商的性能特征是完全独一无二的。
      • 还有JSON 数据类型吗?!感谢您的提示!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      相关资源
      最近更新 更多