mysql前缀索引的索引选择性

前言:前缀索引一般是用在字符串型(varchar)的数据列创建索引时考虑。

一. 基础概念 
在mysql中建立前缀索引的意义在于相对于整列建立索引,前缀索引仅仅是选择该列的部分字符作为索引减少索引的字符可以节约索引空间,从而提高索引效率,但这样也会降低索引的选择性

关于索引的选择性,它是指不重复的索引值(也称为基数cardinality)和数据表的记录总数的比值,范围从1/(数据表记录总数)到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。选择性为1的索引叫唯一索引,这是最好的索引选择性,性能也是最好的 
建立合理前缀索引的诀窍在于要选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间)。前缀应该足够长,以使得前缀索引的选择性接近于索引的整个列。换句话说,前缀的基数应该接近于完整列的基数

二. 实地测试 

我们建一张表测试下:

mysql前缀索引的索引选择性_第1张图片

(1)在表里面插入以下数据:

mysql前缀索引的索引选择性_第2张图片

注意,该表总记录数为10,其中有3条为重复的数据(小明),我们可以计算得到该表的name字段的索引选择性为8/10=0.8

我们用sql语句来验证下:

mysql前缀索引的索引选择性_第3张图片

(2)接下来,我们用sql语句来测试下,我们的前缀索引的最佳长度:

mysql前缀索引的索引选择性_第4张图片

因为该测试表中插入的数据量少,数据也较一般性,所以可以看到当选择前3个字符作为前缀索引后,索引的选择性达到了0.8,接近(等于)完整列的索引选择性0.8

(3)接下来,我们来建立起合适的前缀索引:

mysql前缀索引的索引选择性_第5张图片

这时,该字段的索引就建好了。如下:

mysql前缀索引的索引选择性_第6张图片

我们也可以用sql语句来查询下该字段是否建立索引:

(4)前缀索引已经建好了,这时,我们来使用sql语句查询name字段,看是否使用到了我们所建的索引:

mysql前缀索引的索引选择性_第7张图片

查询结果显示,我们确实是用到了我们建的前缀索引。

三. 注意事项 
① 前缀索引是一种能使索引更小,更快的有效办法,但另一方面也有其缺点:mysql无法使用其前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描 
② 要明确使用前缀索引的目的与优势: 
.大大节约索引空间,从而提高索引效率 
.对于 BOLB 、 TEXT 或者很长的 VARCHAR 类型的列,必须使用前缀索引,因为 MySQL 不允许索引这些列的完整长度 
③ 前缀索引会降低索引的选择性 
④ 真正的难点在于:要选择足够长的前缀以保证较高的选择性,同时又不能太长, 前缀的长度应该使前缀索引的选择性接近索引整个列,即前缀的基数应该接近于完整列的基数

你可能感兴趣的:(MySQL)