【问题标题】:Does VARCHAR size limit matter? [duplicate]VARCHAR 大小限制重要吗? [复制]
【发布时间】:2011-05-18 12:20:55
【问题描述】:

可能重复:
Importance of varchar length in MySQL table

当使用 VARCHAR(假设这是短字符串的正确数据类型)时,大小是否重要?如果我将其设置为 20 个字符,会占用更少的空间还是比 255 个字符更快?

【问题讨论】:

  • 在上面引用的文章中有一个很好的评论。 “有一个可能的性能影响:在 MySQL 中,临时表和 MEMORY 表将 VARCHAR 列存储为固定长度列,填充到其最大长度。如果您设计的 VARCHAR 列远大于您需要的最大大小,您将消耗内存比你需要的多。这会影响缓存效率、排序速度等。”

标签: php mysql database-design varchar


【解决方案1】:

一般来说,对于 VARCHAR 字段,存储在每个字段中的数据量决定了它在磁盘上的占用空间,而不是最大大小(与始终具有相同占用空间的 CHAR 字段不同)。

900 字节索引的所有字段中存储的总数据有上限 (900 byte index size limit in character length)。

您制作的字段越大,人们就越有可能尝试将其用于您预期之外的目的 - 并且显示价值所需的屏幕空间越大 - 因此尝试选择 正确大小,而不是假设如果你把它做得尽可能大,就可以省去重新设计的麻烦。

【讨论】:

  • 请记住,临时表和 MEMORY 表将 VARCHAR 列存储为固定长度列,并填充到其最大长度。
  • 此外,具有固定记录大小的 MyISAM 表的查找时间明显加快。
【解决方案2】:

在 MySQL 的文档中: http://dev.mysql.com/doc/refman/5.0/en/char.html

您有一个表来指示 VARCHAR(4) 的字节(与 CHAR(4) 相比)。

一个没有字符串的简单 VARCHAR(4),只有 1 个字节。然后,一个没有字符串的简单 VARCHAR(255) 是 1 个字节。带有 'ab' 的 VARCHAR(4) 是 3 个字节,带有 'ab' 的 VARCHAR(255) 是 3 个字节。是一样的,但是有长度限制:)

【讨论】:

  • 请记住,临时表和 MEMORY 表将 VARCHAR 列存储为固定长度列,并填充到其最大长度。
【解决方案3】:

是的,在索引多个列时很重要。

前缀最长可达 1000 字节(InnoDB 表为 767 字节)。请注意,前缀限制以字节为单位,而 CREATE TABLE 语句中的前缀长度被解释为字符数。在为使用多字节字符集的列指定前缀长度时,请务必考虑到这一点。

来源:http://dev.mysql.com/doc/refman/5.0/en/column-indexes.html

在 latin1 排序规则中,您最多只能指定 3 列 varchar(255)
varchar(20)最多可以指定50列

直接,如果没有适当的索引,它会减慢查询速度

在存储方面,它没有区别,
varchar 代表variable-length strings

【讨论】:

  • 请记住,临时表和 MEMORY 表将 VARCHAR 列存储为固定长度列,并填充到其最大长度。
【解决方案4】:

required storage space for VARCHAR如下:

VARCHAR(L), VARBINARY(L)L + 1 个字节,如果列值需要 0 – 255 个字节,L + 2 个字节,如果值可能需要超过 255 个字节

所以VARCHAR 只需要字符串的空间加上字符串长度的一两个额外字节。

【讨论】:

    【解决方案5】:

    实际区别是:

    • TINYTEXT 和其他 TEXT 字段与 MySQL 堆内的内存行分开存储,而 VARCHAR() 字段加起来最多为 64k 限制(因此 TINYTEXT 中可以有超过 64k,而你不会VARCHAR)。

    • TINYTEXT 和其他“类似 blob”的字段将强制 SQL 层 (MySQL) 在使用时使用磁盘临时表,而 VARCHAR 仍将在“内存中”排序(尽管将转换为CHAR 为全宽)。

    • InnoDB 内部并不真正关心它是 tinytext 还是 varchar。很容易验证,创建两张表,一张使用 VARCHAR(255),另一张使用 TINYINT,然后在两者中插入一条记录。它们都将占用单个 16k 页 - 而如果使用溢出页,则 TINYTEXT 表应在“SHOW TABLE STATUS”中显示为占用至少 32k。

    我通常更喜欢 VARCHAR(255) - 它们不会对单行造成过多的堆碎片,并且可以被视为 MySQL 内存中的单个 64k 对象。在 InnoDB 上,大小差异可以忽略不计。

    【讨论】:

    • 请记住,临时表和 MEMORY 表将 VARCHAR 列存储为固定长度列,并填充到其最大长度。
    【解决方案6】:

    这不会影响性能。在这种情况下,约束仅有助于确保数据完整性。

    【讨论】:

    • 它会对性能产生巨大影响。如果您使用一个 VarChar 列(或 Text,或其他可变宽度列),MySQL 使用动态宽度行格式。因此,要进行表扫描,需要它按顺序读取每一行以找到下一行。跳过几百个字节和几千个字节(因为有多个超长 VarChars)之间的差异可能非常显着(主要取决于底层驱动器结构和块设备)。但简而言之,它绝对会降低性能(主要是对于具有 GB 数据的大型表,但是您会注意到它)...
    【解决方案7】:

    如果您将其设置为 20,它将仅保存前 20 个字符。所以是的,它占用的空间少于 255 个字符:)。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多