MySQL----前缀索引 & 单列索引与联合索引

文章目录

    • 前缀索引
      • 语法:
      • 前缀长度
      • 前缀索引的查询流程
    • 单列索引与联合索引


MySQL----前缀索引 & 单列索引与联合索引_第1张图片
请添加图片描述

前缀索引

当字段类型为字符串(varchar,text,longtext等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO, 影响查询效率。

此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

语法:

create index idx_xxxx on table_name(column(n)) ;

为tb_user表的email字段,建立长度为5的前缀索引。

create index idx_email_5 on tb_user(email(5));
show index from tb_user;

请添加图片描述

前缀长度

可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

select count(distinct email) / count(*) from tb_user ;
select count(distinct substring(email,1,5)) / count(*) from tb_user ;

前缀索引的查询流程

MySQL----前缀索引 & 单列索引与联合索引_第2张图片

单列索引与联合索引

单列索引:即一个索引只包含单个列。

联合索引:即一个索引包含了多个列。

MySQL----前缀索引 & 单列索引与联合索引_第3张图片

在查询出来的索引中,既有单列索引,又有联合索引。

explain select id,phone,name from tb_user where phone='17799990010' and name='韩信';

MySQL----前缀索引 & 单列索引与联合索引_第4张图片

通过上述执行计划我们可以看出来,在and连接的两个字段 phone、name上都是有单列索引的,但是最终mysql只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的。

来创建一个phone和name字段的联合索引来查询一下执行计划。

create unique index idx_user_phone_name on tb_user(phone,name);
explain select id,phone,name from tb_user where phone='17799990010' and name='韩信';

MySQL----前缀索引 & 单列索引与联合索引_第5张图片
查询时,就走了联合索引,而在联合索引中包含 phone、name的信息,在叶子节点下挂的是对应的主键id,所以查询是无需回表查询的。

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

如果查询使用的是联合索引,具体的结构示意图如下:
MySQL----前缀索引 & 单列索引与联合索引_第6张图片

你可能感兴趣的:(MySQL,mysql,dba,数据库,SQL,database)