二级索引、回表、索引覆盖、索引下推

文章介绍了数据库中的一级和二级索引原理,强调了索引在提升查询性能的同时,也会带来额外的空间和时间成本。回表是通过二级索引找到主键后再在聚簇索引中获取完整数据的过程,而索引覆盖和索引下推是优化查询效率的策略。文章讨论了如何根据查询需求合理创建和使用索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、二级索引原理

假设你要是针对其他字段建立索引,比如基于name字段简历一个索引,那么此时你插入数据的时候,就会重新搞一颗B+树,B+树的叶子节点也是数据页,但是这个数据页仅仅放主键字段和name字段

name字段的索引B+树里,叶子节点的数据页中的name值都是按大小排序的,同时下一个数据页里的name字段值都是大于上一个数据页的name字段值,这个整体的排序规则都跟聚簇索引按照主键的排序规则是一样的。name字段的索引B+树也会构建多层级的索引页,这个索引页里存放的就是下一层的页号和最小name字段值,整体规则都是一样的,只不过存放的都是name字段值,根据name字段排序。

如果根据name字段来搜索数据,那搜索过程简直都一样了,不就是从name字段的索引B+树里的根节点开始找,一层一层往下找,一直找到叶子节点的数据页中,定位到name字段对应的主键值,之后需要进行回表。也就是更具找到的主键id再去聚簇索引中开始从根节点开始查找数据,直到找到叶子节点的数据页,定位到主键对应的完整数据行。

因为我们根据name子弹的索引B+树找到主键之后,还要根据主键去聚簇索引里找,所以一般把name字段这种普通字段的索引称之为二级索引一级索引就是聚簇索引,这就是普通字段索引的运行原理。同理,我们也可以把多个字段联合起来,建立联合索引,比如:age+name

联合索引的运行原理也是一样的,只不过是建立一颗独立的B+树,叶子节点的数据页存放的是id+name+age,然后按照name排序,name排序一样接着按照age排序,不同数据页之间的name+age值的排序也是如此。

二、索引是不是越多越好?

索引的好处是显而易见的,就是可以根据索引B+树来快速找到数据,不需要全表搜索,性能提升很高。但是索引越来越多也是有坏处的。主要有俩点:一:空间,二:时间

空间:如果给很多字段加上索引的话,那你必须会有很多索引B+树,每颗B+树都要占用很多的磁盘空间,所以你要是搞的索引太多,就会很耗费磁盘空间。

时间:很多字段上建立了索引,那么你在进行增删改查的时候,每次都需要维护各个索引的数据有序性,因为每个索引B+树都要求业内是按照值大小排序的,页之间也是有序的,下一个页的所有值必须大于上一个页的所有值。所以你不停的增删改查,必然会导致各个数据页之间的值大小可能会没有顺序,比如下一个数据页插入了一个比较小的值,居然比上一个数据页的值要小,此时就没有办法,只能进行数据页的挪动,维护页之间的顺序,或者你不断插入数据,各个索引页的数据页就要不停的分裂,不停的增加新的索引页,这个过程都是很耗费时间的。

三、回表

select name,age from user where name = '张三';

假设我们在user表中给name建立了一个二级索引,并且我们执行上面sql语句。因为二级索引中只包含了id+name俩个字段,但是查询语句却需要name、age俩个字段,现在就需要我们根据找到的二级索引中记录的id,去聚簇索引中找到数据页,再从数据页获取到name、age字段。通常通过二级索引找到数据后,再去聚簇索引查询的情况,我们成为:回表。

四、索引覆盖

select name,age from user where name = '张三';

假设我们在user表中给name,age建立了一个联合索引索引,并且我们执行上面sql语句。因为二级索引中包含id+name+age三个字段,同时查询语句需要name、age俩个字段,所以不需要去回表从聚簇索引再找一次数据。通常可以从索引中直接找到我们需要的字段的情况,我们称为:索引覆盖

五、索引下推

select name,age from user where name = '张三' and age = 18 ;

假设我们在user表中给name,age建立了一个联合索引索引,并且我们执行上面sql语句。因为二级索引中包含id+name+age三个字段,查询语句先是通过name='张三'找到数据,接着通过age=18找到数据。像这种查询就属于:索引下推

借道友法力一用:

========================== stay hungry stay foolish =============================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值