mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理

   今天给大家介绍mysql InnoDB 下3种常用的索引:主键索引(聚集索引)、非聚集索引、覆盖索引

下面已一张表具体的表为例:来演示数据查找的过程。

譬如:一张用户表 User表 Id是主键

 mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_第1张图片

主键索引,也被称为”聚集索引“,是InnoDB 引擎中是最重要的索引结构,主键索引的数据结构是一颗“B+树”,树的子节点存储索引节点信息及关联关系,树的叶子节点存储主键索引信息+数据,一颗树的叶子节点按照主键索引有序排列开来,查找起来更便捷。

我们查询id=2 这笔数据的过程如下:

mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_第2张图片

 

先找到对应根索引2<3,向树的左边继续查找,查找到最下面的叶子节点,查找到这个节点对应的数据进行返回。

非聚集索引,譬如:我们常用的普通索引或者复合索引,已User表中的name索引为例说明

mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_第3张图片

 

 

mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_第4张图片

非聚集索引存储的具体的索引字段信息,而叶子节点存储主键索引+数据,为了要找到“zhangsan”这行数据,需要先在非聚集索引中找到对应的主键,再根据主键索引,查找对应的行数据,等于走了两遍B+树进行搜索,效率上肯定比主键索引低。

覆盖索引,首先看一下它的定义:如果查询的列字段在索引关键字中能找到则直接返回。我们先建一个复合索引 idx_name_addr(name,addr),查询语句:select name,addr from User;

因查询列中的字段在索引关键字中能找到,故符合覆盖索引的定义,那么这种覆盖索引的数据结构是怎么样的?它又是怎么样在索引结构能快速的返回的呢?我们一起看一下如下图覆盖索引结构

mysql InnoDB 引擎下主键索引、非聚集索引、覆盖索引的实现原理_第5张图片

 

我们建了name,addr 的复合索引,那么在上图中的索引叶子节点中会存索引字段+数据,而如果

查询的列中能全部匹配索引关键字,则直接返回对应索引的数据,那么此时就不用在根据索引的主键

在聚集索引中再查找一遍,等于覆盖索引能减少IO操作,所以我们在某些特殊场景下,如果只查索引列的字段,建议可以使用覆盖索引,能大幅度提供查询性能。

 

你可能感兴趣的:(mysql)