当前位置: 首页 > 后端技术 > Java

InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述

时间:2023-04-01 19:08:26 Java

InnoDB聚簇索引和非聚簇索引简介,涵盖索引、回表、索引下推,种类繁多,零散,但概念都是建立在索引之上的。本文从索引搜索数据中介绍上述概念。聚集索引和非聚集索引在MySQL数据库InnoDB存储引擎中,B+树可以分为聚集索引和非聚集索引。聚集索引也称为聚簇索引,非聚集索引也称为辅助索引或二级索引。建表时会创建聚簇索引,每张表都有一个唯一的聚簇索引:如果定义了主键,则使用主键作为聚簇索引;如果没有定义主键,那么表的第一个唯一非空索引作为聚集索引,如果没有主键也没有唯一索引,InnoDB会在内部生成一个隐藏的主键作为聚集索引。这个隐藏的主键是一个6字节的列,其值将随着数据的插入而自动递增。创建表时添加的索引都是非聚集索引。非聚集索引是寻找聚集索引的二级索引。通过二级索引索引找到主键,然后查找数据。创建一个表T,表中有一个主键id。表中有字段k,在字段k上建立索引。mysql>createtableT(idintprimarykey,kintnotnull,namevarchar(16),index(k))engine=InnoDB;表中插入的数据为(100,1)、(200,2)、(300,3)、(500,5)、(600,6),分别用R1~R5表示。创建表和插入数据时,会生成两棵树:左边一棵是聚集索引,右边一棵是非聚集索引。非聚集索引的叶子节点存放的是主键的值,聚集索引存放的是整行的数据。执行select*fromTwherekbetween3~5有如下执行过程:1、在k索引树上找到k=3,得到ID=3002,然后在ID索引树中找到ID=300对应的R33。从第k棵索引树取下一个值k=5,得到ID=5004,然后回到ID索引树找到ID=500对应的R45,从第k棵索引树取下一个值k=6,如果条件不满足,查询结束于这个过程中,回表回调从二级索引到主键索引树查找的过程。上述过程两次返回表,即第2步和第4步。如果覆盖索引执行的语句是selectIDfromTwherek在3到5之间,此时只需要检查ID的值,而ID的值已经在k索引树上了,所以有此时不需要返回表,也就是说在这个查询中,索引k“覆盖”了这个查询,这叫做覆盖索引。由于覆盖索引可以减少树的搜索次数,提高查询性能,所以使用覆盖索引是一种常用的索引优化方法。覆盖索引最常见的使用方式是创建联合索引,将所有需要查询的字段放在联合索引上。最左前缀原则最左前缀原则是指在一个复合索引(a,b,c)中,b+树会按照从左到右的顺序构建搜索树,b+树会先比较a。如果在依次比较b和c中a相同,最终得到检索到的数据,但是query(b,c)等数据没有字段,b+树不知道从哪个结点查找。因为搜索树的第一个比较因子是a。索引下推(icp)索引下推是mysql5.6的一个新特性,创建表使用,主要有几个字段:id,name,age,address。创建联合索引(姓名、年龄)。mysql>createtableuse(idintprimarykey,namevarchar(16),ageint,index(name,age))engine=InnoDB;分别在表中插入数据,(ID3,张六,30),(ID4,张三,10),(ID5,张三,10),(106,张三,20)执行如下查询:select*fromuserwherenamelike'Zhang%'andage=10上面说了InnoDB索引满足最大左匹配原则,不满足最左前缀怎么办?在这棵搜索树中,只能通过“张”找到满足条件103的,再判断其他条件是否满足。Mysql5.6之前执行此语句与Mysql5.6和Mysql5.6之后不一致。Mysql5.6之前,5.6之前是没有索引下推的。只能从ID3开始逐一回表,虚线表示回表。在主键索引上找到数据行,然后比较字段值,如下图:5.6介绍索引下推。在索引遍历过程中,可以先判断索引中包含的字段,不满足条件的记录可以直接过滤掉,减少回表次数。如下图:索引下推后,InnoDB判断(name,age)索引中age是否等于10,不等于10则跳过,只需要返回表两次。小结本文从索引查询数据流向介绍数据库索引的概念,包括聚簇索引、非聚簇索引、覆盖索引、返回表、最左匹配、索引下推,掌握基础知识可以更快优化数据库。例如,要减少返回表的次数,最好使用聚簇索引或覆盖索引。加快数据查询。参考极客时间|简单索引(下)如果您觉得文章对您有帮助,请点个赞吧!