聚簇索引是什么,如何构建的,如何回表
聚簇索引(InnoDB)完整讲解:概念、构建、回表(结合前面案例)
一、聚簇索引 基本概念
1. 定义
聚簇索引(聚集索引) InnoDB 引擎特有,主键就是聚簇索引 ,表的数据行本身就存在聚簇索引的叶子节点中。
- 一张 InnoDB 表有且仅有一个聚簇索引
- 数据和索引物理存放在一起,叶子节点 = 整行数据
- 无主键时,InnoDB 会自动选唯一非空列 / 隐藏列充当聚簇索引
2. 和普通二级索引核心区别
- 聚簇索引叶子:整行所有字段数据
- 二级索引(普通 / 唯一 / 前缀索引)叶子:索引字段值 + 主键值
二、聚簇索引如何构建(结合示例表)
沿用表
student,主键sid,数据如下:表格
sid (主键) sname 1 张三 2 张三丰 3 张小花 4 李四 5 李磊 6 王五 1. 构建规则
- 以主键 sid 作为排序依据,按主键值升序 组织成 B + 树;
- 非叶子节点:只存主键分界值,用于检索引路;
- 叶子节点 :按主键有序存放完整的一行数据(主键 + 姓名 + 所有字段);
- 叶子节点之间用双向链表串联。
2. 聚簇索引 B + 树 结构(可视化)
plaintext
根节点(非叶子,存主键分界值:3) ↓ 左分支(≤3) 右分支(>3) ┌──────────────┐ ┌──────────────┐ │叶子节点组1 │ │叶子节点组2 │ │(1,张三) │ │(4,李四) │ │(2,张三丰) │ │(5,李磊) │ │(3,张小花) │ │(6,王五) │ └──────────────┘ └──────────────┘
- 每一条叶子数据 = 主键 + 整行数据
- 整张表的数据,全部集中在聚簇索引的叶子节点里
3. 构建过程简述
- 建表指定
PRIMARY KEY(sid),系统自动创建聚簇索引;- 插入数据时,按主键
sid大小排序,依次写入 B + 树 叶子节点;- 数据增多、节点分裂时,自动向上更新非叶子分界节点;
- 最终形成一棵以主键排序、数据与索引合一的 B + 树。
三、什么是回表?为什么要回表?
1. 回表定义
通过二级索引 查到主键值 后,再拿着这个主键去聚簇索引 中查询完整行数据,这个过程就叫 回表。
2. 产生原因
二级索引(前缀索引 / 普通索引)叶子只存:
索引字段 + 主键,没有完整数据,必须借助主键去聚簇索引拿全数据。
四、结合「查找张三丰」完整演示:二级索引 → 回表 → 聚簇索引
场景回顾
查询语句:
sql
SELECT * FROM student WHERE sname = '张三丰';索引:
sname(2)前缀索引(二级索引)完整流程(分两大阶段)
阶段 1:走【前缀二级索引 B + 树】拿到主键
- 截取查询值
张三丰前 2 位:张三;- 进入前缀索引 B + 树,二分查找定位叶子节点;
- 匹配到两条前缀为
张三的索引项:
(张三, sid=1)(张三, sid=2)- 得到候选主键:
1、2。阶段 2:【回表】------ 用主键查询【聚簇索引 B + 树】
拿着主键
sid=1进入聚簇索引:
- 从根节点按主键二分查找,定位叶子节点;
- 取出整行数据:
sid=1,sname=张三;- 对比完整姓名,不匹配,丢弃。
拿着主键
sid=2进入聚簇索引:
- 按主键找到对应叶子节点;
- 取出整行数据:
sid=2,sname=张三丰;- 完全匹配,保留结果。
最终返回该行数据,回表过程结束。
五、关键考点总结(背诵版)
聚簇索引InnoDB 主键即聚簇索引,数据行直接存于 B + 树 叶子节点,一张表仅有一个。构建时按主键值升序组织 B + 树,非叶子节点存主键分界值用于查找。
回表二级索引仅保存索引字段 + 主键,无法获取完整数据;利用二级索引查到主键后,再通过主键访问聚簇索引读取整行数据,该过程称为回表。
补充考点
- 覆盖索引:查询字段全部在二级索引中,无需回表;
- 前缀索引:一定产生回表(只存部分字符);
- 主键查询:直接走聚簇索引,无回表。
MySQL-聚簇索引
XZ-0700012026-06-03 14:09
相关推荐
Nturmoils14 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT渣波18 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码Jim6001 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障GreatSQL2 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级倔强的石头_2 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战云技纵横5 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待沉默王二5 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite