14.MySQL索引底层原理:从数据结构到B+树的深度解析

目录

开篇:索引是什么?为什么需要它?

候选数据结构:为什么选B+树?

[1. 二叉搜索树(及变种:AVL、红黑树)](#1. 二叉搜索树(及变种:AVL、红黑树))

[2. 哈希表](#2. 哈希表)

[3. B树(N叉搜索树)](#3. B树(N叉搜索树))

[4. B+树(索引的核心数据结构)](#4. B+树(索引的核心数据结构))

[B+树 vs B树:优势在哪里?](#B+树 vs B树:优势在哪里?)

MySQL中的"页(page)":索引的物理载体

高频面试题回顾

总结


开篇:索引是什么?为什么需要它?

索引相当于书的目录 ,核心作用是加快查询速度。但索引并非"免费午餐",它有代价:

  • 消耗额外存储空间;

  • 可能拖慢增删改速度(因为删除/修改常搭配where条件,若where能走索引查询,索引维护会有开销)。

通常索引利大于弊 :存储成本(硬盘便宜)不是核心矛盾;实际开发中读频率远高于写频率(比如"作业表"场景:同学查看作业是读操作,写入记录是写操作,读远多于写)。

候选数据结构:为什么选B+树?

索引需要高效的数据结构,我们逐一分析常见结构:

1. 二叉搜索树(及变种:AVL、红黑树)

  • 二叉搜索树:查找时间复杂度平均O(logN) ,但最坏O(N)(退化成链表)。

  • AVL树:要求严格平衡(任何节点左右子树高度差≤1),查询快,但插入/删除需频繁调整树结构,开销大。

  • 红黑树:做了权衡,不要求严格平衡,把查询稍慢一点(几乎感知不到),换取插入/删除效率提升。

但二叉搜索树(包括AVL、红黑树)作为索引的问题:树高过高(元素多时),IO访问次数多(数据库从硬盘读数据,IO是瓶颈)。

2. 哈希表

哈希表查找时间复杂度O(1),但缺陷明显:

  • 仅支持相等条件查询 (如=),不支持范围查询(< >)、模糊匹配;

  • hash函数将key转为数组下标,无法利用数据的"有序性"。

3. B树(N叉搜索树)

B树是多叉搜索树,改进了二叉树的树高问题:

  • 每个节点存N个值,划分N+1个区间;

  • 一次IO操作可读取一个节点,拿到N个key比较,减少IO次数。

但B树仍有不足,于是有了B+树(索引的专属数据结构)。

4. B+树(索引的核心数据结构)

B+树是B树的改进版,也是N叉搜索树,核心特点:

  1. 每个节点存N个值,划分N个区间,其中的最后一个元素表示当前子树的最大值;

  2. 叶子节点是数据全集 ,并通过双向链表串起来(方便范围查询);

  3. 非叶子节点只存索引key(子节点位置),叶子节点存完整数据行;

  4. 所有数据都在叶子节点,查询必须到叶子,开销稳定(比较次数相当);

  5. N叉树高度更低(比红黑树更矮),IO次数更少。

B+树 vs B树:优势在哪里?

  • 范围查询 :B+树叶子节点用双向链表连接,范围查询(如between)只需遍历链表;B树范围查询需中序遍历,效率低。

  • 空间利用:非叶子节点只存key,不存数据,更省内存,适合缓存。

  • 查询稳定:每次查询都到叶子,中间比较次数相当,开销稳定。

  • 树高更低:N叉结构让树高更矮,IO次数更少。

MySQL中的"页(page)":索引的物理载体

MySQL中,"页"是B+树上的节点:

  • 数据页 :叶子节点,存储若干数据行(如学生表的id, name, gender, age);

  • 索引页 :非叶子节点,只存key和子节点位置(也是"页")。

数据库以页为单位从硬盘读取 ,利用局部性原理(程序访问某位置数据后,大概率访问附近数据),减少IO次数。

高频面试题回顾

面试中常问:

  • 什么是索引?

  • 索引使用的什么数据结构?(答:B+树,及对比AVL、红黑树、哈希表、B树的优劣)

总结

索引的本质是用空间换时间 ,核心数据结构是B+树(兼顾查询、插入删除、范围查询、IO效率)。理解B+树的结构(多叉、叶子链表、非叶子存key),以及MySQL"页"的设计,就能掌握索引底层逻辑。

相关推荐
zander25814 分钟前
114. 二叉树展开为链表
数据结构·链表·深度优先
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
garuda herb1 小时前
生成专题页Blog--建立并返回 MySQL 数据库连接
python·mysql
奶糖 肥晨1 小时前
DBeaver 安装与 MySQL 连接配置教程
数据库·mysql
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦1682 小时前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
Database_Cool_4 小时前
阿里云 RDS MySQL 降本增效实战:从规格选型到成本优化,月成本降低64%全攻略
mysql·阿里云·云计算
Cloud云卷云舒13 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
延凡科技15 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
用户713335851562416 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql