索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢

devtools/2025/2/2 15:42:11/

索引的底层数据结构

MySQL中常用的是Hash索引和B+树索引

Hash索引:基于哈希表实现的,查找速度非常快,但是由于哈希表的特性,不支持范围查找和排序,在MySQL中支持的哈希索引是自适应的,不能手动创建

B+树的结构

        B+树 是一种高效的多路平衡树,适合磁盘存储和范围查询。它的结构特点包括数据集中在叶子节点、叶子节点连接成链表、内部节点仅存储键值和指针。在数据库和文件系统中,B+树 被广泛应用于索引和数据存储,具有查询性能稳定、适合高并发等优势。

 如图:B+树具有以下特点:

只有叶子结点才存放数据,中间节点都是用来存放目录项作为索引

非叶子节点分为不同层次,通过分层来降低每一层的搜索量

B+树的搜索策略:

从根节点开始,通过二分法快速定位到符合页内范围包含查询值的页,在中间结点中继续根据二分法来寻找符合页内范围复合查询值的页,接着在叶子节点中通过槽查找记录使用二分法快速定位要查询的记录在哪个槽,找到槽后再遍历槽中所有的记录,找到寻找的分组。

为什么InnoDB使用B+树而不是B树呢 

B-Tree:

  • 每个节点既存储数据也存储子节点的指针
  • 数据分布在所有的节点中,包括内部节点和叶子节点
  • 查找时可能会直接在内部节点中就能找到数据不需要遍历到叶子节点

B+Tree:

  • 只有叶子结点存储数据,内部节点仅存储键值和子节点的指针
  • 所有叶子节点通过指针连接成一个有序链表
  • 查找时必须遍历到叶子节点才能获取数据 

B+Tree的优势:

更适合磁盘I/O:

  • 因为B+树的内部节点不存储数据只存储键值和指针,所以每个节点可以存储更多的键值,从而降低树的高度,树的高度越低磁盘I/O次数越少,查询性能越高(索引数据量很大,一定是存储在磁盘中的,每访问一个节点就会进行一次磁盘IO操作,所以树的高度越低,一次查询的期望IO次数就越少,效率就越高)
  • B+树的叶子节点通过指针连接成链表,更适合范围查询如(BETWEEN,>,<等操作),而树的范围查询需要在不同层级的节点之间跳转,效率较低 

更适合数据库场景:

  • 数据集中在叶子节点上,查询时都需要遍历到叶子节点,这使得查询性能更稳定。B树的数据可能分布在内部节点和叶子结点,查询性能不稳定 
  • 数据库查询中经常需要使用范围查询,B+树的叶子节点链表结构非常适合这种场景,而B树需要多次遍历内部节点

更适合并发控制:

  • 在并发场景下,B+树的叶子节点链表可以更容易地支持范围查询和顺序访问
  • 而B树的结构在并发访问时可能需要更多的锁机制(数据分布在内部节点和叶子节点。节点分裂与合并涉及多个节点。锁的粒度较大,容易导致锁冲突)

B+树在InnoDB中的具体应用:

主键索引(聚簇索引):

        InnoDB使用B+树实现主键索引,叶子节点存储完整的数据行

        这种设计是的通过主键查询数据时可以直接获取数据,不需要回表

二级索引(非聚簇索引): 

        InnoDB的二级索引也是B+树,但是叶子节点存储的是主键值,通过二级索引查询时,先获取主键值再通过主键索引查找数据(回表)


http://www.ppmy.cn/devtools/155472.html

相关文章

Python3 【闭包】项目实战:5个新颖的学习案例

Python3 【闭包】项目实战&#xff1a;5个新颖的学习案例 以下是 5个闭包应用项目&#xff0c;涵盖实际场景并附带完整代码、解释和测试案例。 项目1&#xff1a;待办事项列表&#xff08;Todo List&#xff09; 功能&#xff1a;使用闭包管理待办事项的添加、删除和展示。 …

Shell特殊状态变量以及常用内置变量总结

目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…

14JavaWeb——SpringBoot原理

SpingBoot原理 在前面十多天的课程当中&#xff0c;我们学习的都是web开发的技术使用&#xff0c;都是面向应用层面的&#xff0c;我们学会了怎么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇&#xff0c;主要偏向于底层原理。 我们今天的课程安…

MATLAB语言的测试开发

MATLAB语言的测试开发 引言 MATLAB&#xff08;矩阵实验室&#xff09;是一种高性能的技术计算语言&#xff0c;广泛用于工程、科学、数学和经济等各个领域。其强大的计算能力和丰富的工具箱&#xff0c;使得MATLAB在数据分析、算法开发、模型建立以及仿真等方面得到了广泛应…

笔记:同步电机调试时电角度校正方法说明

电角度校正原理&#xff1a; 电机在额定转速附近时&#xff0c;零扭矩开管&#xff0c;查看U2-31是否在0上下波动&#xff08;均值在/-50以内即可&#xff09;&#xff0c;若有偏差&#xff0c;关管后&#xff0c;校准电角度&#xff08;均值每偏差50&#xff0c;调整1度&…

十分钟快速上手 markdown

前言 本人利用寒假期间&#xff0c;将自己所学的markdown的知识&#xff0c;以及将自己常用的一些操作和注意事项记录下来&#xff0c;希望能够帮助大家 一、markdown是什么 Markdown 是一种轻量级标记语言&#xff0c;说白了就是可以让你利用最简单的语法达到最好的排版效果…

【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题

我们在使用uni-popup时&#xff0c;如果想要给弹出内容添加一个背景颜色&#xff0c;我们会发现在安全区域是不显示该背景颜色的。 首先根据如下的目录结构找到uni-popup.vue文件 在该文件中找到bottom配置&#xff0c;将红箭头所指代码注释掉 下面的安全区域就没有了&#xff…

智能门锁开发系列:从设计到实现的全面解析

01-面试大保健-智能门锁-概述 1. 项目背景 智能门锁作为物联网领域的应用之一&#xff0c;核心功能是开锁&#xff0c;但除了开锁之外&#xff0c;它还支持多种方式进行操作&#xff0c;提升了用户体验。在这篇博客中&#xff0c;我们将详细回顾智能门锁项目的背景、开发环境…