【问题标题】:VARCHAR(x) - Does setting a length turn it into "fixed-length" in MySQL performance terms?VARCHAR(x) - 在 MySQL 性能方面设置长度是否会变成“固定长度”?
【发布时间】:2010-01-06 17:55:44
【问题描述】:

我了解 CHAR 和 VARCHAR 之间的区别,一个是固定长度,另一个是可变长度,如果一行中的所有字段都是固定长度的,那么表通常会表现得更好。

但是,我不清楚的是,如果我给 VARCHAR 一个长度,例如 VARCHAR(500),这是否会将行保留为固定长度?

对于上下文,我有一个包含 50 列的干净表,主要是 TINYINT,但我需要此表中的两列作为 VARCHAR,因为它们每列最多需要存储 500 个字符。确切长度取决于用户输入,因此未知。

作为附加条件,我真的不想将这些 VARCHAR 字段放入单独的引用表中,因为它会产生不必要的连接并且不能非常有效地符合预期的查询模式。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: mysql database database-design char varchar


    【解决方案1】:

    显然不是,否则它一开始就不会被称为variable-length。它所做的只是限制您可以存储在该列中的字符串的最大长度。在其他更可靠的数据库引擎上,长度超过最大值的字符串会产生错误,但 MySQL 只会截断多余的数据:

    mysql> create table t (a varchar(3));
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into t values ('abc'), ('defgh');
    Query OK, 2 rows affected, 1 warning (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 1
    
    mysql> select * from t;
    +------+
    | a    |
    +------+
    | abc  |
    | def  |
    +------+
    2 rows in set (0.00 sec)
    

    【讨论】:

    • 还请记住,varchar 实际上每条记录会使用比字符串中的字节数更多的存储空间。它这样做是为了存储字符串长度以及字符串。例如。如果您使用 varchar(5) ,并且所有记录的字段都填充了 5 个字符,那么每条记录将使用 6 个字节。 char(5) 将只为每条记录使用 5 个字节。当您拥有数百万行时,这可能会有所不同!尽管在这种情况下,具有整数 id 引用的查找表可能会更好地提高性能 - 特别是如果字段中的任何数据在许多行中重复时。希望对您有所帮助。
    【解决方案2】:

    不,它只是设置最大尺寸。

    CHAR 和 VARCHAR 类型的声明长度表示要存储的最大字符数。例如,CHAR(30) 最多可容纳 30 个字符。

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多