MySQL索引的物理层存储是怎样的?

MySQL索引的物理层存储:像图书馆的书架一样排列数据

一、索引是什么?(图书馆的“书位地图”)

想象图书馆有10万本书,如果没有索引:

  • 找《哈利波特》需要逐本翻看(全表扫描),可能要1小时!
  • 有了索引(如按书名首字母排序),直接去H区找,1分钟搞定!

MySQL索引的本质
是一种特殊的数据结构(类似B+树),存储索引键(如书名)和数据行地址(如书架位置),让查询像查字典一样快。

二、索引的物理存储结构:像多层书架的“B+树”
1. B+树结构(MySQL最常用的索引结构)
        [根节点:中间字母]
        /               \
    [H-K节点]         [L-O节点]
    /    |    \       /    |    \
[Ha-He] [Hf-Hn]... [La-Le] [Lf-Ln]...
  |       |           |       |
指向数据行 指向数据行   指向数据行 指向数据行
  • 叶子节点:存储完整的索引键值数据行地址(如磁盘块号)。
  • 非叶子节点:存储“索引键的中间值”,用于快速定位叶子节点(类似字典的部首目录)。
2. 聚集索引 vs 非聚集索引
类型聚集索引(主键索引)非聚集索引(普通索引)
存储内容索引键 + 完整数据行索引键 + 主键值(或数据行地址)
物理结构数据行直接按索引顺序存储(像字典)独立于数据表的索引结构(像附录)
查找流程直接定位数据(一步到位)先查索引,再通过主键查数据(两步)
-- 创建示例表(含聚集索引和非聚集索引)
CREATE TABLE books (
    id INT PRIMARY KEY,            -- 聚集索引(主键)
    title VARCHAR(100),
    author VARCHAR(50),
    price DECIMAL(10,2),
    INDEX idx_title (title)        -- 非聚集索引(普通索引)
);
三、索引的物理存储文件(硬盘上的“地图册”)

在InnoDB存储引擎中:

  • 数据表文件(.ibd):存储聚集索引数据行,按B+树结构组织。
  • 索引文件:每个非聚集索引单独存储为B+树,叶子节点存储主键值。
# Linux系统下查看MySQL数据文件
ls -la /var/lib/mysql/mydatabase/books.ibd
# 这个文件包含:
# - 聚集索引(主键+完整数据)
# - 所有非聚集索引(索引键+主键值)
四、索引如何加速查询?(查字典的过程)
-- 查询书名以"哈利波特"开头的书
SELECT * FROM books WHERE title LIKE '哈利波特%';

执行流程

  1. 通过索引定位

    • idx_title索引的B+树中,快速找到“哈利波特”开头的叶子节点(类似查字典部首)。
    • 叶子节点存储主键值(如id=1,2,3)。
  2. 回表查询

    • 通过主键值(id)在聚集索引中找到完整数据行(类似根据字典页码翻到对应页)。
五、使用场景:何时该用索引?(像给不同书做不同标签)
场景示例索引选择建议
高频WHERE查询WHERE age > 18age字段创建索引
JOIN关联条件FROM users JOIN orders ON...为关联字段(如user_id)加索引
排序(ORDER BY)ORDER BY create_time DESCcreate_time创建索引
唯一约束(UNIQUE)CREATE UNIQUE INDEX...确保字段值唯一(如邮箱)
六、底层原理:B+树如何让查询变快?(为什么不用数组?)
  1. 二叉树 vs B+树

    • 二叉树(每个节点2个子节点):查询深度大(如100万数据需20层)。
    • B+树(每个节点100-1000个子节点):查询深度小(3-4层即可存100万数据)。
  2. 磁盘IO优化

    • B+树每个节点大小为1个磁盘页(通常16KB),每次IO读取整个节点。
    • 非叶子节点不存储数据,只存索引键,可容纳更多索引项,减少IO次数。
七、思维导图:索引的物理层世界
MySQL索引物理存储
├── 核心结构
│   ├── B+树(多层书架)
│   │   ├── 叶子节点(存索引键+数据地址)
│   │   └── 非叶子节点(存中间值,快速定位)
│   ├── 聚集索引(主键+完整数据)
│   └── 非聚集索引(索引键+主键值)
├── 存储文件
│   ├── .ibd文件(数据表+聚集索引)
│   └── 独立索引文件(非聚集索引)
├── 工作原理
│   ├── 快速定位(类似查字典)
│   ├── 回表查询(通过主键找数据)
│   └── 磁盘IO优化(节点大小=磁盘页)
└── 使用场景
    ├── WHERE条件字段
    ├── JOIN关联字段
    ├── ORDER BY排序字段
    └── UNIQUE唯一约束
八、流程图:索引查询的“快递路线”
用户查询 → 检查WHERE条件 → 
    ┌─ 有索引 → 通过索引B+树找到主键值 → 通过主键查聚集索引 → 返回数据
    └─ 无索引 → 全表扫描(逐行检查)
九、概念图:聚集索引与非聚集索引的协作
┌─────────────────────────────────────────────┐
│                数据表(books)                 │
│  ┌───────────────────┐  ┌─────────────┐      │
│  │  聚集索引(主键)   │  │  数据行     │      │
│  │  (按id排序)      │  │  (按id存储)│      │
│  └───────────────────┘  └─────────────┘      │
└───────────────────────────┬─────────────────┘
                            │ 数据行地址
                            ▼
┌─────────────────────────────────────────────┐
│               非聚集索引(idx_title)           │
│  ┌───────────────────┐  ┌─────────────┐      │
│  │  B+树结构         │  │  叶子节点    │      │
│  │  (按title排序)   │  │  (title→id)│      │
│  └───────────────────┘  └─────────────┘      │
└───────────────────────────┬─────────────────┘
                            │ 主键值
                            ▼
┌─────────────────────────────────────────────┐
│               聚集索引(主键id)               │
│  ┌───────────────────┐  ┌─────────────┐      │
│  │  B+树结构         │  │  叶子节点    │      │
│  │  (按id排序)      │  │  (id→完整数据)│
│  └───────────────────┘  └─────────────┘      │
└─────────────────────────────────────────────┘
十、总结:索引是数据的“超级地图”

MySQL索引就像图书馆的书架系统:

  • B+树结构让查询像查字典一样快,减少逐行扫描;
  • 聚集索引把数据按主键顺序存放,非聚集索引通过主键关联;
  • 索引文件独立存储,优化磁盘IO效率。

理解索引的物理存储,能帮助你在开发中:

  1. 合理创建索引:给高频查询字段加索引,避免冗余索引。
  2. 优化查询性能:减少回表次数,利用覆盖索引(索引包含所有查询字段)。
  3. 避免索引失效:了解哪些情况会导致索引不生效(如函数操作、类型不匹配)。

就像图书馆管理员通过书架标签快速找到书,MySQL通过索引快速定位数据,让你的应用跑得更快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值