https://www.cnblogs.com/studyzy/p/4310653.html

推荐使用情况

  • 字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。也就是=‘xxx’ 或者 like ‘xxx%’
  • 字符串本身可能比较长,而且前几个字符就开始不相同。比如我们对中国人的姓名使用前缀索引就没啥意义,因为中国人名字都很短,另外对收件地址使用前缀索引也不是很实用,因为一方面收件地址一般都是以XX省开头,也就是说前几个字符都是差不多的,而且收件地址进行检索一般都是like ’%xxx%’,不会用到前匹配。相反对外国人的姓名可以使用前缀索引,因为其字符较长,而且前几个字符的选择性比较高。同样电子邮件也是一个可以使用前缀索引的字段。
  • 前一半字符的索引选择性就已经接近于全字段的索引选择性。如果整个字段的长度为20,索引选择性为0.9,而我们对前10个字符建立前缀索引其选择性也只有0.5,那么我们需要继续加大前缀字符的长度,但是这个时候前缀索引的优势已经不明显,没有太大的建前缀索引的必要了。

步骤

1 计算索引选择性

  1. select 1.0*count(distinct column_name)/count(*) from table_name

2 计算前缀索引的最佳前缀字符

  1. select 1.0*count(distinct left(column_name,prefix_length))/count(*) from table_name

3 建立前缀索引

  1. ALTER TABLE table_name ADD KEY(column_name(prefix_length));

示例

  1. select 1.0*count(distinct company_name)/count(*) from oms_company #0.70510
  2. select 1.0*count(distinct left(company_name, 3))/count(*) from oms_company #0.01564
  3. select 1.0*count(distinct left(company_name, 10))/count(*) from oms_company #0.64598
  4. select 1.0*count(distinct left(company_name, 11))/count(*) from oms_company #0.70487,接近索引选择性的值,为最佳前缀字符
  5. ALTER TABLE oms_company ADD KEY(company_name(prefix_length));