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

Mysql 固定长度列的最有效数据类型,mysql,phpmyadmin,sqldatatypes,mysql-5.6,Mysql,Phpmyadmin,Sqldatatypes,Mysql 5.6,我正在设计我的数据库结构 有许多列是固定长度的,其中至少有一列是纯字母数字的 因此我想知道: 对于固定长度的列,通常什么是(或是)最有效的数据类型 固定长度字母数字列的最有效数据类型是(或是)什么 为什么? 使用VARCHAR,不用担心 这只是当您处理的数据太多,无法安装在单个驱动器上,或者即使是在单个服务器上,也无法安装满驱动器时才需要考虑的问题 管理数十亿行数据库的公司在这方面有问题,但只有当你变得这么大时,你才会这样做。使用VARCHAR,不用担心 这只是当您处理的数据太多,无法安装在单个

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

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

因此我想知道:

  • 对于固定长度的列,通常什么是(或是)最有效的数据类型
  • 固定长度字母数字列的最有效数据类型是(或是)什么
  • 为什么?

  • 使用
    VARCHAR
    ,不用担心

    这只是当您处理的数据太多,无法安装在单个驱动器上,或者即使是在单个服务器上,也无法安装满驱动器时才需要考虑的问题


    管理数十亿行数据库的公司在这方面有问题,但只有当你变得这么大时,你才会这样做。

    使用
    VARCHAR
    ,不用担心

    这只是当您处理的数据太多,无法安装在单个驱动器上,或者即使是在单个服务器上,也无法安装满驱动器时才需要考虑的问题


    管理数十亿行数据库的公司在这方面有问题,但只有当你变得这么大时才会有问题。

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

    长答覆:

    立柱占用的空间是影响空间和速度的主要因素

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

    country_code CHAR(2) CHARACTER SET ascii
    uuid CHAR(36) CHARACTER SET ascii
    
    固定长度的
    VARCHAR
    CHAR
    之间的区别是实际字符串前面的1字节或2字节长度字段。除非你有几十亿行,否则这“没什么大不了的”

    处理速度差异不显著,但
    CHAR
    ascii
    win

    如果您有所有的数字字符串,您可能希望使用
    INT
    4字节或
    BIGINT
    8字节或
    DECIMAL(30)
    14字节等,而不是使用
    CHAR
    VARCHAR
    ,后者每位数有1个字节。数字字段都是固定长度的。但是,要小心。美国电话号码是固定长度的,但国际电话号码各不相同

    你的意思是除了“字母数字”之外还有别的东西。如果您指的是
    BINARY
    /
    VARBINARY
    /
    BLOB
    ,那么规则基本相同

    例如,uuid可以通过适当的转换从
    CHAR(36)
    (36字节)缩小到
    BINARY(16)
    (16字节)。后者在速度和空间方面更好,但会增加代码的复杂性。(不管怎样,UUID对于大型表来说非常糟糕;这是另一个主题。)


    使用整数,始终考虑<代码> Bigint < /> V>代码> int <代码> VS <代码> Mudiuth VS >代码> SimultI/<代码> VS >代码> TINYINT,并且通常钉在<代码>未签名< /COD>。(分别占用8/4/3/2/1字节)在最初创建表时执行此操作;稍后做

    修改是很麻烦的。

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

    长答覆:

    立柱占用的空间是影响空间和速度的主要因素

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

    country_code CHAR(2) CHARACTER SET ascii
    uuid CHAR(36) CHARACTER SET ascii
    
    固定长度的
    VARCHAR
    CHAR
    之间的区别是实际字符串前面的1字节或2字节长度字段。除非你有几十亿行,否则这“没什么大不了的”

    处理速度差异不显著,但
    CHAR
    ascii
    win

    如果您有所有的数字字符串,您可能希望使用
    INT
    4字节或
    BIGINT
    8字节或
    DECIMAL(30)
    14字节等,而不是使用
    CHAR
    VARCHAR
    ,后者每位数有1个字节。数字字段都是固定长度的。但是,要小心。美国电话号码是固定长度的,但国际电话号码各不相同

    你的意思是除了“字母数字”之外还有别的东西。如果您指的是
    BINARY
    /
    VARBINARY
    /
    BLOB
    ,那么规则基本相同

    例如,uuid可以通过适当的转换从
    CHAR(36)
    (36字节)缩小到
    BINARY(16)
    (16字节)。后者在速度和空间方面更好,但会增加代码的复杂性。(不管怎样,UUID对于大型表来说非常糟糕;这是另一个主题。)


    使用整数,始终考虑<代码> Bigint < /> V>代码> int <代码> VS <代码> Mudiuth VS >代码> SimultI/<代码> VS >代码> TINYINT,并且通常钉在<代码>未签名< /COD>。(分别占用8/4/3/2/1字节)在最初创建表时执行此操作;以后做

    修改
    会很麻烦。

    包括一些关于固定长度的
    字符的信息,我会将其标记为答案即使一行有27列,您仍然保持相同的位置?通过提出更优化的模式或使用类似
    JSON
    type column而不是某个过宽的行,但无论如何,MySQL通常都不关心或不受影响。如果您对这样的性能有任何疑问,请编写一个脚本,通过插入N百万行来测试您的系统,看看它是如何运行的。您的提供程序的性能特征是完全独特的。是否存在
    JSON
    数据类型?!谢谢你的提示!包含一些关于固定长度的
    char
    的信息,我会将其标记为答案即使一行有27列,您仍然保持相同的位置?通过提出一个更优化的模式或使用类似
    JSON
    类型的列,而不是一些过度使用的列,您将获得更多的性能提升广泛的行,但在任何情况下MySQL通常不关心或萨满