为什么聚簇索引只有一个?什么是回表、索引覆盖、左匹配和索引下推?

本文详细介绍了数据库中的聚簇索引和非聚簇索引概念,解释了为何聚簇索引通常只有一个。通过实例展示了数据存储方式,并阐述了回表现象、索引覆盖、最左匹配原则以及索引下推优化技术,帮助读者深入理解数据库索引的工作原理。

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

1.如何判断是否为聚簇索引?

取决于数据和索引是否放在一起,数据和索引放在一起则为聚簇索引,否则为非聚簇索引

2.为什么聚簇索引只有一个?

我们先假设有这么一张表table和数据
在这里插入图片描述

2.1首先我们先看MYISAM:只能是非聚簇索引(因为数据和索引是分开存放的)
在这里插入图片描述
在这里插入图片描述
myisam上面放的是索引(1),下面存放的是实际数据行地址(0x0022)


2.2INNODB:主键索引就是聚簇索引,只能有一个聚簇索引,但是可以有很多非聚簇索引
在这里插入图片描述
当innodb插入数据的时候,必须要包含一个索引的key值,可以是主键,如果没有主键,那么就是唯一键,如果没有唯一键,那么就是自生成的6字节rowid
在这里插入图片描述
innodb上面放的是索引(1),下面是数据(1,teacher.ma)

因为聚簇索引数据跟索引放到一起,如果有多个聚簇索引就会产生数据冗余


3.假设我们再给name字段加个索引,之前的id已经是主键了,那么存储方式就会演变成下面这种了

在这里插入图片描述
为什么呢?因为我们给name建立了非聚簇索引,所以name下面就不能存放数据,因为会造成数据冗余,那应该放什么?
在这里插入图片描述

应该放数据所在索引的key的值,所有非聚簇索引都指向聚簇索引,不然找不到数据


4.什么是回表?

还是上面的一张表,我们假设id是主键,name是索引列

select * from table where name = ma

先根据name查询id,再根据id查询整行的记录,走了2颗B+树,此时这种现象叫回表

回表:当根据普通索引查询到聚簇索引的key值之后,再根据key值聚簇索引中获取所有行记录


5.什么是索引覆盖
select id,name from table where name = ma

根据name可以直接查询id,name两个列的值,直接返回即可,不需要从聚簇索引查询任何数据,此时叫索引覆盖


6.什么是最左匹配

还是上面那张表,id是主键,name和age是组合索引列,组合索引使用的时候必须先匹配name再匹配age
在这里插入图片描述
最左匹配在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配


7.什么是索引下推

mysql分为三层架构
在这里插入图片描述

select * from table where name=?and age=

在没有索引下推之前:先根据name从存储引擎中获取符合规则的数据,然后再server层对age进行过滤

有索引下推之后:根据name,age两个的条件来从存储引擎中获取对应的数据

索引下推原来在server层做的计算,放到存储引擎中计算了,减少了server层和存储引擎层的数据交互

### 索引概念及特点 在 MySQL 的 InnoDB 存储引擎中,索引是一种特殊的索引形式,在这种结构下,表中的数据行被物理地存储在一起[^1]。具体而言,索引的叶节点包含了完整的行记录,这意味着当访问基于索引的数据时可以直接获取所需的信息而无需额外查找其他位置。 #### 特点: - 表内仅能存在一个索引; - 插入新行或更新现有行的位置取决于其键值顺序; - 对于范围查询特别有效率,因为连续的相关行会更可能位于相邻页面上; ```sql CREATE TABLE example ( id INT NOT NULL, name VARCHAR(50), PRIMARY KEY (id) -- 这里定义了一个索引 ); ``` ### 索引 vs 非索引索引(Secondary Index),又被称为辅助索引,它并不影响实际数据行的排列方式。相反,它的叶节点保存着指向对应索引条目的指针——通常是主键 ID 或者唯一标识符[^2]。因此,使用非索引来检索数据往往涉及两次I/O操作:先定位到非索引找到相应的主键ID,再利用该ID去读取真正的数据行,这一过程即所谓的“回表”。 | 属性 | 索引 | 非索引 | |-------------|----------------------------------|-----------------------------------| | 数据分布 | 按照索引键有序存储 | 不改变原始数据布局 | | 查询效率 | 更高效尤其针对单个/少量记录 | 可能较慢特别是需要频繁回表的情况 | | 更新成本 | 较高因需维护树形结构 | 相对较低 | ### 回表是什么 所谓“回表”,是指通过非索引首次查得的结果只是得到了目标记录所在的具体位置信息(如主键值)。为了获得全部字段的内容,则还需要再次回到索引处进行第二次精确匹配并取出完整的一行或多行数据[^3]。这增加了磁盘IO次数从而降低了整体性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值