【问题标题】:vachar maximum length for index with InnoDB and UTF-8InnoDB 和 UTF-8 索引的 varchar 最大长度
【发布时间】:2013-04-24 19:08:21
【问题描述】:

我读到 MySQL 5.6 只能索引 the first 767 bytesvarchar(或其他基于文本的类型)。我的模式字符集是utf-8,因此每个字符最多可以存储 3 个字节。由于 767/3 = 255.66,这将表明需要以 255 个字符编制索引的文本列的最大长度。经验似乎证实了这一点,如下所示:

create table gaga (
    val varchar(255),
    index(val)
)   engine = InnoDB;

但是将 val 的定义更改为 varchar(256) 会产生“错误代码:1071。指定的密钥太长;最大密钥长度为 767 字节”。

在当今时代,255 个字符的限制似乎非常低,所以:这是正确的吗?如果这是用 MySQL 索引更大的文本的最佳方法是什么? (我应该避免它吗?存储一个 SHA?使用另一种索引?使用另一种数据库字符编码?)

【问题讨论】:

    标签: mysql indexing innodb


    【解决方案1】:

    虽然这个限制可能看起来很荒谬,但它会让你考虑是否真的需要为这么长的 varchar 字段设置索引。即使是 767 字节,索引大小也会增长得非常快,而且对于大表(它最有用的地方)很可能无法放入内存。

    另一方面,至少在我的经验中,我需要索引长 varchar 字段的唯一常见情况是唯一约束。在所有这些情况下,来自 varchar 字段的某些组 id 和 MD5 的复合索引就足够了。唯一的问题是模仿不区分大小写的排序规则(它认为重音字符和非重音字符相等),尽管在所有情况下我都使用二进制排序规则,所以这不是问题。

    UPD。索引长 varchar 的另一个常见情况是排序。对于这种情况,我通常定义一个单独的索引排序器字段,它是 5-15 个字符的前缀,具体取决于数据分布。对我来说,紧凑的索引比很少不准确的排序更可取。

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2012-03-24
      • 2012-02-08
      相关资源
      最近更新 更多