一觉醒来,技术交流群的大佬们又在讨论技术了,今天讨论的是回表的问题,在这里记录一下,方便日后的学习和复习

首先,什么是回表查询?
回表就是先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树。从普通索引B+树搜索回到主键索引B+树搜索的过程称为回表
众所周知,主键索引是聚簇索引,而一张表里面只能有一个聚簇索引,所以非主键索引也就是非聚簇索引
顺便聊一下聚簇索引和非聚簇索引的区别吧
聚簇索引:将数据存储和索引放在一起,并且是按照一定的顺序的,找到了索引也就意味着找到了数据,数据的物理存放顺序和索引是一致的,换句话说,只要索引是相邻的,那么对应的数据在磁盘上也一定是相邻的
非聚簇索引:叶子节点不存储数据而是存储数据行的地址,如果想要在磁盘查找数据,需要根据索引查找到数据行的位置再去磁盘查找数据
都知道可以通过覆盖索引来避免回表,那么覆盖索引是什么呢?
有下面三种理解:
解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
当发起一个被索引覆盖的查询(也叫作索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息

从执行结果上看,这个SQL语句只通过索引,就取到了所需要的数据,这个过程就叫做索引覆盖。
本文探讨了数据库中的回表查询现象,解释了回表的定义,即通过非主键索引查找数据时需要返回主键索引获取完整信息。同时,介绍了聚簇索引和非聚簇索引的区别,聚簇索引将数据与索引存储在一起,而非聚簇索引的叶子节点存储数据行位置。此外,文章还阐述了覆盖索引的概念,它是查询仅通过索引即可完成,避免了回表操作。通过覆盖索引可以提高查询效率,当查询使用到的列完全被索引覆盖时,EXPLAIN的Extra列会显示'Using index'。

6636

被折叠的 条评论
为什么被折叠?



