MySQL-聚簇索引

聚簇索引是什么,如何构建的,如何回表

聚簇索引(InnoDB)完整讲解:概念、构建、回表(结合前面案例)

一、聚簇索引 基本概念

1. 定义

聚簇索引(聚集索引) InnoDB 引擎特有,主键就是聚簇索引 ,表的数据行本身就存在聚簇索引的叶子节点中。

  • 一张 InnoDB 表有且仅有一个聚簇索引
  • 数据和索引物理存放在一起,叶子节点 = 整行数据
  • 无主键时,InnoDB 会自动选唯一非空列 / 隐藏列充当聚簇索引

2. 和普通二级索引核心区别

  • 聚簇索引叶子:整行所有字段数据
  • 二级索引(普通 / 唯一 / 前缀索引)叶子:索引字段值 + 主键值

二、聚簇索引如何构建(结合示例表)

沿用表 student,主键 sid,数据如下:

表格

sid (主键) sname
1 张三
2 张三丰
3 张小花
4 李四
5 李磊
6 王五

1. 构建规则

  1. 以主键 sid 作为排序依据,按主键值升序 组织成 B + 树;
  2. 非叶子节点:只存主键分界值,用于检索引路;
  3. 叶子节点 :按主键有序存放完整的一行数据(主键 + 姓名 + 所有字段);
  4. 叶子节点之间用双向链表串联。

2. 聚簇索引 B + 树 结构(可视化)

plaintext

复制代码
            根节点(非叶子,存主键分界值:3)
                  ↓
    左分支(≤3)        右分支(>3)
┌──────────────┐  ┌──────────────┐
│叶子节点组1    │  │叶子节点组2    │
│(1,张三)      │  │(4,李四)      │
│(2,张三丰)    │  │(5,李磊)      │
│(3,张小花)    │  │(6,王五)      │
└──────────────┘  └──────────────┘
  • 每一条叶子数据 = 主键 + 整行数据
  • 整张表的数据,全部集中在聚簇索引的叶子节点里

3. 构建过程简述

  1. 建表指定 PRIMARY KEY(sid),系统自动创建聚簇索引;
  2. 插入数据时,按主键 sid 大小排序,依次写入 B + 树 叶子节点;
  3. 数据增多、节点分裂时,自动向上更新非叶子分界节点;
  4. 最终形成一棵以主键排序、数据与索引合一的 B + 树。

三、什么是回表?为什么要回表?

1. 回表定义

通过二级索引 查到主键值 后,再拿着这个主键去聚簇索引 中查询完整行数据,这个过程就叫 回表。

2. 产生原因

二级索引(前缀索引 / 普通索引)叶子只存:索引字段 + 主键,没有完整数据,必须借助主键去聚簇索引拿全数据。


四、结合「查找张三丰」完整演示:二级索引 → 回表 → 聚簇索引

场景回顾

查询语句:

sql

复制代码
SELECT * FROM student WHERE sname = '张三丰';

索引:sname(2) 前缀索引(二级索引)

完整流程(分两大阶段)

阶段 1:走【前缀二级索引 B + 树】拿到主键

  1. 截取查询值 张三丰 前 2 位:张三;
  2. 进入前缀索引 B + 树,二分查找定位叶子节点;
  3. 匹配到两条前缀为张三的索引项:
    • (张三, sid=1)
    • (张三, sid=2)
  4. 得到候选主键:1、2。

阶段 2:【回表】------ 用主键查询【聚簇索引 B + 树】

  1. 拿着主键 sid=1 进入聚簇索引:

    • 从根节点按主键二分查找,定位叶子节点;
    • 取出整行数据:sid=1,sname=张三;
    • 对比完整姓名,不匹配,丢弃。
  2. 拿着主键 sid=2 进入聚簇索引:

    • 按主键找到对应叶子节点;
    • 取出整行数据:sid=2,sname=张三丰;
    • 完全匹配,保留结果。
  3. 最终返回该行数据,回表过程结束。


五、关键考点总结(背诵版)

  1. 聚簇索引InnoDB 主键即聚簇索引,数据行直接存于 B + 树 叶子节点,一张表仅有一个。构建时按主键值升序组织 B + 树,非叶子节点存主键分界值用于查找。

  2. 回表二级索引仅保存索引字段 + 主键,无法获取完整数据;利用二级索引查到主键后,再通过主键访问聚簇索引读取整行数据,该过程称为回表。

  3. 补充考点

  • 覆盖索引:查询字段全部在二级索引中,无需回表;
  • 前缀索引:一定产生回表(只存部分字符);
  • 主键查询:直接走聚簇索引,无回表。
相关推荐
李兆龙的博客3 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
倔强的石头_5 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间5 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西5 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西6 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹6 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座
要开心吖ZSH7 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
loong_XL8 小时前
决策模型做内容安全检测:从踩坑到上线
数据库·安全·jev·决策模型
这个DBA有点耶8 小时前
数据库双轨并行实战:全量并行策略、增量延迟控制、双向回切与一致性校验
数据库·架构·dba
Gl�ria8 小时前
MySQL 单机版 vs 高可用版:宕机排查 + 故障处理
mysql·adb·架构