Mysql索引原理之字符串前缀索引

Mysql索引原理之字符串前缀索引

前面已经提到,对于非主键的字符串类型索引,也会按照字段的值建立
一套B+Tree的结构,默认是以值的字典序来排的。然后叶子节点挂着的
是主键的id,因为它们是同一条记录,然后去主键索引结构中根据id查
找出记录。

但是如果这个字段的值是比较长的字符串的话,整个索引就比较大,无
论是查找还是索引的更新都会不方便,于是MySQL支持了字符串的前缀索
引,即只取字符串的前n位来作为节点创建索引,实际上,在按字典序来
建立索引结构的时候,通过前面几个字符大概就能确定其位置范围了,然
后Mysql会在这个小的范围内遍历出要匹配的条件,从而达到提速的目的。

未建索引,普通索引;分别记录下执行时间
select * from test where name = ‘xxxxx’;

前缀索引的建立:
alter table test add KEY (name(5));
name一定要设置成字符型,否则会报错。

那好,如何确定取前面几个字符呢?

显然,这个场景是一个观察的结果,也就是说,必须要有一定量的实际数
据,我们才能分析出其规律,也就是说这个索引是在后期优化得来的,前
期没必要建立。

最好的选择是每一列的前n个字符的串都不相同,尽量朝这方面努力。

1、计算出不重复的概率
select COUNT(DISTINCT name) / COUNT(*) as rate from test;

2、找出接近rate的一个n
select COUNT(DISTINCT LEFT(name, 3)) / COUNT() as rate3 from test;
select COUNT(DISTINCT LEFT(name, 5)) / COUNT(
) as rate5 from test;
select COUNT(DISTINCT LEFT(name, 7)) / COUNT() as rate7 from test;
select COUNT(DISTINCT LEFT(name, 9)) / COUNT(
) as rate9 from test;
select COUNT(DISTINCT LEFT(name, 11)) / COUNT() as rate11 from test;
select COUNT(DISTINCT LEFT(name, 15)) / COUNT(
) as rate15 from test;
select COUNT(DISTINCT LEFT(name, 20)) / COUNT(*) as rate20 from test;

试出最合理的n

添加完索引后,
select * from test where name = ‘xxxxx’;

看看有没有比普通索引快。

你可能感兴趣的:(Mysql)