关于回表的一些讨论

一觉醒来,技术交流群的大佬们又在讨论技术了,今天讨论的是回表的问题,在这里记录一下,方便日后的学习和复习
在这里插入图片描述
首先,什么是回表查询?
回表就是先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树。从普通索引B+树搜索回到主键索引B+树搜索的过程称为回表

众所周知,主键索引是聚簇索引,而一张表里面只能有一个聚簇索引,所以非主键索引也就是非聚簇索引

顺便聊一下聚簇索引和非聚簇索引的区别吧
聚簇索引:将数据存储和索引放在一起,并且是按照一定的顺序的,找到了索引也就意味着找到了数据,数据的物理存放顺序和索引是一致的,换句话说,只要索引是相邻的,那么对应的数据在磁盘上也一定是相邻的
非聚簇索引:叶子节点不存储数据而是存储数据行的地址,如果想要在磁盘查找数据,需要根据索引查找到数据行的位置再去磁盘查找数据

都知道可以通过覆盖索引来避免回表,那么覆盖索引是什么呢?
有下面三种理解:

解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
  
当发起一个被索引覆盖的查询(也叫作索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息

在这里插入图片描述

从执行结果上看,这个SQL语句只通过索引,就取到了所需要的数据,这个过程就叫做索引覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值