InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能超过3072。
所以长字符串字段 用B+
树完整建立索引是不行的,而且空间占用也太大了。
对于长字符串,有两种方法建立索引:
1.模拟哈希索引
新建一列用于存储该字符列的hash值(哈希函数不要使用SHA1(),MD5(),因为会产生很长的字符串,浪费空间,比较也慢,最好是返回整数的hash函数),在该列建立索引,查询时必须在where子句中包含常量值,以避免hash冲突(
例如:SELECT id
FROM urlT
WHERE url_hash = hash('www.blog.csdn.net')
AND url = 'www.blog.csdn.net')。
2.使用前缀索引
要考虑选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间),最后还要考虑数据分布。
只对字符串的前几个字符进行索引。
通过字符串的前几个字符我们已经能大概排序字符串了,剩下不能排序的可以通过遍历进行查找啊,
这样只在B+树中存储字符串的前几个字符的编码,既节约空间,又减少了字符串的比较时间,还大概能解决排序的问题,
比方说我们在建表语句中只对name列的前10个字符进行索引可以这么写:
CREATE TABLE person_info( name VARCHAR(100) NOT NULL, birthday DATE NOT NULL, phone_number CHAR(11) NOT NULL, country varchar(100) NOT NULL, KEY idx_name_age_birthday (name(10), birthday, phone_number) );
name(10)就表示在建立的B+树索引中只保留记录的前10个字符的编码,
这种只索引字符串值的前缀的策略是我们非常鼓励的,尤其是在字符串类型能存储的字符比较多的时候。
摘自: