讲下面的知识的时候,需要知道例如表的varchar字段存储了很长的值,那我们给这个varchar字段建立索引,就会让索引变得很大 或者说如果需要我们通过文章内容进行查询,这个内容是text类型的字段,存储了上万个字符,我们对这么多字符建立索引,会导致索引变得庞大
前缀索引 当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大(索引长度大),查询时,浪费大量的磁盘IO,影响查询效率。 此时可以只将字符串的一部分前缀截取出来,建立前缀,这样可以大大节约索引空间,从而提高索引效率。语法如下
create index idx_自命名 on 表名(字段(n)); #n表示要截取该字段前面的几个字符来构建索引,n可以叫前缀长度
前缀长度 可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性 是1,这是最好的索引选择性,性能也是最好的
如何获取tb_user表的email字段的选择性
select count(distinct email) / count(*) from tb_user;
select count(distinct substring(email,1,5)) / count(*) from tb_user;
总结:尽量截取最少的字符作为前缀索引,让选择性尽量接近或等于1,这样查询效率越高,也可降低索引存储的空间
前缀索引的查询流程如下
1、把表中的id列创建主键索引(也叫聚集索引), 聚集索引在B+树查的是某个id值对应的一整行的数据
2、把email列的每个值的前5个字符截取出来,作为5个前缀索引,前缀索引就是二级索引(也叫辅助索引),二级索引在B+树查的是某个二级索引对应的id值
3、前缀索引必然回表