我读到MySQL 5.6只能索引varchar
(或其他基于文本的类型)的the first 767 bytes。我的架构字符集是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?使用其他类型的索引?使用其他数据库字符编码?)
答案 0 :(得分:7)
虽然这种限制可能看起来很荒谬,但是如果你确实需要这么长的varchar字段的索引,它会让你思考。即使使用767字节,索引大小也会非常快速地增长,对于大型表(最有用的),很可能不适合内存。
另一方面,至少根据我的经验,我需要索引长varchar字段的唯一常见情况是唯一约束。在所有这些情况下,来自varchar字段的某些组ID和MD5的复合索引就足够了。唯一的问题是模仿不区分大小写的排序规则(考虑重音字符和非重音字符相等),尽管在我的所有情况下我都使用二进制排序规则,所以这不是问题。
UPD。索引long varchar的另一个常见情况是排序。在这种情况下,我通常会定义一个单独的索引分类器字段,根据数据分布,该字段是5-15个字符的前缀。对我来说,紧凑的索引比很少不准确的排序更优选。