有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。
前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。
前缀索引的选择性
使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。
Tips:主键索引和唯一索引的索引值是不可能重复的,索引的选择性就很高,查询效率也最好。
选择足够长的前缀可以更好的保证高选择性,但又不能太长,需要一个合适的长度。怎么选?
-
在数据增长不是很快的表,可以通过以下方式来计算出合适的前缀索引的选择长度值:
SELECT COUNT(DISTINCT index_column)/COUNT(*) FROM table_name;
Tips:index_column 代表要添加前缀索引的列
-
在数据增长很快的表中,上述方式计算就不准确了,原因在于数据增长很快的表 index_column 字段重复的记录和总记录数据变化都比较快,那么计算出来的前缀索引长度也是随着变化很快的。
创建前缀索引
ALTER TABLE table_name ADD INDEX index_name (index_column(length));
前缀索引的局限性
前缀索引能使索引更小、更快,但是 MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。
后缀索引
MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引。