#yyds干货盘点#MySQL学习-索引的基础篇(下)

Posted 汤圆学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#MySQL学习-索引的基础篇(下)相关的知识,希望对你有一定的参考价值。

作者:汤圆

个人博客: javalover.cc

前言

前面介绍了索引的基础知识,包括索引的模型、分类、重建等等;

本篇我们再延伸一下索引的分类,比如覆盖索引、联合索引;

索引的分类从的方面来说,分为主键索引和非主键索引,像即将介绍的这些索引都属于非主键索引;

目录

  1. 覆盖索引
  2. 联合索引
  3. 最左前缀原则
  4. 索引下推

正文

1. 覆盖索引

怎么理解呢?

就比如我们执行下面的查询语句:

select id from T where k between 3 and 5;

这里面id主键k是非主键索引,非主键索引中存储的就是主键的值,所以这里的查询需求(id)被覆盖了,我们不需要回表进行二次查询;

简单点来理解就是,如果一条语句只查询主键的值,且用到了非主键索引,那么这个非主键索引就是覆盖索引;

这个覆盖索引的好处就是提升了查询效率;

2. 联合索引

一般的索引都是将一个字段设置为索引;

为了提高查询效率,因为联合索引可以查询联合索引的所有字段的值;

表面上看有点类似覆盖索引,都是为了简化查询,不用回表;

例子

比如我们现在有两个字段:身份证号、姓名;然后将这两个字段设置为联合索引,那么我们在通过身份证号查询姓名时,就可以一次查到,不用回表;

如果没有联合索引,那就需要先通过身份证号获取主键ID值,然后再根据主键ID值获取姓名;

有的,缺点跟下面即将介绍的最左前缀原则有关,那就是如果查询条件不是联合索引的第一个字段,那么该联合索引就会失效;

还是上面的身份证号+姓名的例子,如果我们不是通过身份证号查询姓名,而是通过姓名查询身份证号,那么此时联合索引就失效了;

就是根据业务需要调整联合索引中字段的顺序,像上面这个业务,根据身份证号查询姓名应该是比较常用的,因为身份证号有唯一性,所以就可以将身份证号字段放到第一位;然后将姓名字段单独再设为一个索引;

简单点来说,就是先设定一个顺序,如果该顺序可以少建立一个其他的索引,那么该顺序就是可以接受的;

3. 最左前缀原则

比如上面的联合索引 身份证号+姓名,只有一个查询条件身份证号时,也是可以用到该联合索引的;

根据这个原则,我们可以再来回答一下上面的问题:怎么来确定联合索引中字段的顺序?

上面提到了要考虑会不会增加其他索引;

其实还有一个方面是要考虑空间占用问题,下面我们用例子来说明;

例子:

比如有需求为:根据姓名查询年龄,也要根据年龄查询姓名,那此时要怎么建立索引呢?

根据最左前缀原则,他俩的顺序其实怎么建都一样;

但是考虑到空间占用问题,就需要将姓名放到前面,因为姓名字段肯定比年龄字段占用空间大,此时的联合索引为(name, age);

然后再为年龄字段单独建立一个普通索引 (age);

4. 索引下推

例子:

select * from tuser where name like 张% and age=10 and ismale=1;

这里假设联合索引为 (name, age),此时的查询过程如下:

  1. 先去联合索引中筛选 name 以"张"开头的用户;
  2. 再在结果集中筛选 age = 10 的用户;
  3. 最后遍历这些结果集,依次取出主键ID的值,再 回表 查询 ismale=1的数据;

这里的前面两步都是直接在联合索引中就可以查到的,因为联合索引保存了联合字段的值;

只有最后一步, ismale 不在联合字段中,才需要回表查询;

总结

本篇主要介绍了覆盖索引和联合索引,以及相关的一些规则,比如最左前缀原则,索引下推等

  • 覆盖索引:如果要查询的结果字段已经存储在索引中,那么这个索引就是覆盖索引;
  • 联合索引:就是把多个字段联合起来,建立一个索引,这个索引就是联合索引;联合索引需要考虑怎么将多个字段排序,可以少建立其他索引的顺序就是好顺序;
  • 最左前缀原则:比如上面的联合索引 身份证号+姓名,如果只有一个查询条件 身份证号,那么此时就会用到最左前缀原则;普通索引(字符串类型),如果查询条件为字符串的左边N个字符,那么也会用到最左前缀原则
  • 索引下推:还是基于联合索引,当查询条件的多个字段在联合索引中时,这些字段会在联合索引中进行挨个查询,不需要回表;

以上是关于#yyds干货盘点#MySQL学习-索引的基础篇(下)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#MySQL学习-为啥有时候会选错索引

#yyds干货盘点# 图解MySQL索引下推

#yyds干货盘点#MySQL索引优化系列:索引失效

#yyds干货盘点#深入浅出,一文吃透mysql索引

#yyds干货盘点#分布式技术专题「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)

#yyds干货盘点#MySQL索引优化系列:索引全用及最左法则