Mysql性能优化:为何要用覆盖索引?

导读spring

相信读者看过不少MYSQL索引优化的文章,其中有不少优化的方法,好比最佳左前缀覆盖索引等方法,可是你真正理解为何要使用最佳左前缀,为何使用覆盖索引会提高查询的效率吗?sql

本篇文章将从MYSQL内部结构上讲一下为何覆盖索引可以提高效率。性能优化

陈某先带读者了解三个概念,分别是InnoDB索引模型、主键索引和非主键索引的区别、回表。框架

InnoDB索引模型ide

在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又由于前面咱们提到的,InnoDB使用了B+树索引模型,因此数据都是存储在B+树中的。性能

每个索引在InnoDB里面对应一棵B+树。优化

主键索引和非主键索引的区别spa

主键索引又叫聚簇索引 ,非主键索引又叫普通索引,那么这两种索引有什么区别呢?3d

主键索引的叶子节点存放的是整行数据,非主键索引的叶子节点存放的是主键的值。code

假设有一张User表(id,age,name,address),其中有id和age两个字段,其中id是主键,age是普通索引,有几行数据u1-u5的(id,age)的值是(100,1)、(200,2)、(300,3)、(500,5)和(600,6) ,此时的两棵树的示例以下:

从上图能够看出来,基于主键索引的树的叶子节点存放的是整行User数据,基于普通索引age的叶子节点存放的是id(主键)的值。

什么是回表?

假设有一条查询语句以下:

select * from user where age=3;

上面这条sql语句执行的过程以下:

 1. 根据age这个普通索引在age索引树上搜索,获得主键id的值为300。

  2. 由于age索引树并无存储User的所有数据,所以须要根据在age索引树上查询到的主键id的值300再到id索引树搜索一次,查询到了u3。

  3. 返回结果。

上述执行的过程当中,从age索引树再到id索引树的查询的过程叫作回表(回到主键索引树搜索的过程)。

也就是说经过非主键索引的查询须要多扫描一棵索引树,所以须要尽可能使用主键索引查询。

为何使用覆盖索引?

有了上述说起到的几个概念,便能很清楚的理解为何覆盖索引可以提高查询效率了,由于少了一次回表的过程。

假设咱们使用覆盖索引查询,语句以下:

select id from user where age=3;

这条语句执行过程很简单,直接在age索引树中就能查询到id的值,不用再去id索引树中查找其余的数据,避免了回表

总结

覆盖索引的使用可以减小树的搜索次数,避免了回表,显著提高了查询性能,所以覆盖索引是一个经常使用的性能优化手段。

留给读者一个问题:身份证是一我的的惟一识别凭证,若是有根据身份证号查询市民信息的需求,咱们只要在身份证号字段上创建索引就够了。而再创建一个(身份证号、姓名)的联合索引,是否是浪费空间? 

小福利

陈某近期获取到尚硅谷的SpringCloud2020的视频教程,陈某整理了视频的总体框架图

老规矩,回复关键词springcloud2020领取,若连接失效,请联系陈某!!!

文末问题讨论留言区

往期推荐

一条SQL查询语句是如何执行的?

SpringCloud 2020新版视频发布

幂等性如何实现?带你了解一波!!!

老司机带你聊聊接口限流!!!

Spring解决循环依赖,你真的懂了吗?

老司机带你从源码开始撸Spring生命周期!!!