抛开数据结构,InnoDB中B+树究竟存的是什么

彻底搞懂MySql的B+Tree 官方定义:一种能为mysql提高查询效率的数据结构,索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如,一本书,你想找到自己想看的章节内容,直接查询目录就行。这里的目录就类似索引的意思。1.1索引的工作原理转存失败重新上传取消如上图中,如果现在有一条sql语句 select * from user where id = 40,如果没有索引的条件下,我们要找到这条记录,我们就需要在数据中进行全表扫描,匹配id = 40的数据。如果有了索引,我们就可以通过索引进行快速查找,如上图中,可以先在 阅读详情

提出问题

  • InnoDB中B+树各个节点存储的内容是什么?
  • InnoDB中索引的种类有哪些?它们节点存储的内容各自有什么区别?

数据页

InnoDB中页是内存和磁盘交互的基本单位, 默认是16KB。其中存储用户记录的页被称为数据页,也被称为索引页。

数据页的组成

image-20220316163300917

其中我们重点关注的就是 User Record 和 Page Directory 两个组成部分。

  • User Record 用于存储真实的用户数据。
  • Page Directory 可以理解为对 UserRecord 中的数据建立的目录。

下面我们来详细对这两个结构进行分析。

User Record

User Record 是数据页中真实存储用户数据的组成部分。

User Record的特点
  • 数据与数据之间是单向链表,从上一个数据可以找到下一个数据。
  • 数据按照主键的顺序进行排序。
  • InnoDB对User Record中的数据进行分组,最多一个分组里面存储8条数据。

这里我们思考下,为什么需要对数据进行分组?

我们想一下场景,当我们根据主键查询一条记录时,如果只有单向链表的特点,我们需要从开始到结尾去遍历整个页面然后才能获取到我们所需要记录,时间复杂度也就是 O(n)。此时我们引入分组的概念,并记录每个分组中主键最大记录的位于当前页的偏移量,采用二分法的形式,每次获取到一个分组中最大的记录的主键,然后与查询条件主键进行比较,从而快速的定位到所在的分组后,再按照单向链表找到指定的主键对应的记录。这样查询效率迅速提升,时间复杂度就是 O(logm)这里的m也就是分组的个数。

这里也就引出了Page Directory的作用。

Page Directory

Page Directory 可以理解为对 UserRecord 中的数据建立的目录。对应着 User Record中记录的分组信息。Page Directory中存储着多个 slot,也就是槽,每一个槽也就记录着分组中主键最大记录位于当前页的偏移量,能够快速定位到指定的记录。

多个数据页之间的关系

现在我们分析完了单个数据页的结构,并对InnoDB针对单个数据页进行查询优化做了简单的介绍,那么当存储的数据过多而有多个数据页时InnoDB又是如何处理的呢?

这里我们对数据页中 File Header 简单说下, File Header中记录了当前数据页的上一个页的地址和下一个页的地址,简单来说,页与页之间是一个双向链表。

根据双向链表,当我们在多个页之间根据主键查询某条记录时,按照顺序去在每个页面里面去查找,效率比较低。 此时考虑多个页面中是否存在类似于单个页面中分组的概念,能够快速定位到记录对应的页呢?

此时我们引出了存储目录信息的数据页,而不是存储真实用户数据的的数据页。

存储目录信息的数据页

这里的目录信息就是包含其他数据页的页码信息(根据页码信息方便定位到对应的数据页)以及对应数据页中最小主键的值的记录。

在InnoDB中,不管是存储目录的数据页其实还是存储真实数据的数据页是一个概念,它们拥有完全一致的页结构,不用之处在于 UserRecord存储的真实内容不同,在User Record中的记录有一个字段专门记录当前记录存储的是页面信息还是真实用户数据。

这里我们依据存储目录信息的数据页来模拟根据主键进行查询。

如图所示:

image-20220317110829102

  • 在存储目录信息的数据页中根据 Page Directory中的信息,利用二分法快速找到主键所在的数据页信息。
  • 定位到数据页之后,也就很快在单数据页中定位到指定的记录。

值得我们注意的是,此时数据量并不是很大,只是用到一个存储目录信息的数据页,但是当数据量达到百万、千万或者亿级别以上的时候,此时依赖同层(与存储真实数据的数据页直接相连的存储目录信息的数据页)的存储目录信息的数据页可能也会非常多,那么如何进一步提升性能呢?

此时,我们想到我们可以保存存储真实数据的数据页信息,为什么不进一步保存存储目录信息的数据页信息页呢?从而就有了以下的数据结构:

image-20220317112648483

注:其中省略了部分信息

  • 页3用于记录页4、页5、页6的信息,它们存储的都是目录信息。
  • 根据最上级的目录信息的数据页很快定位到下一级的存储目录信息的数据页,从而定位到真实的数据。

从上图结构可以看出InnoDB中数据页的构建像是一棵树,这就是InnoDB所对应的B+树。在InnoDB中根据索引类型的不同,B+树中存储的内容也有点不同。

索引

InnoDB中所以大概可以分为如下几种:

  • 聚簇索引
  • 二级索引
  • 唯一索引
  • 联合索引

接下里分别介绍下上述索引的特点以及对应的数据页存储的内容。

聚簇索引

聚簇索引可以简单理解为针对主键建立的索引。

特点
  • InnoDB根据主键自动创建的索引。
  • B+树中非叶子节点存储的是对应数据页中最小主键信息,以及主键对应的页码信息。
  • B+树中叶子结点存储的是真实的数据。

二级索引

二级索引可以简单理解为根据索引构建的B+树只能查询到对应的主键信息,后续还需要根据主键信息通过聚簇索引获取到真实的数据,这也叫 回表 操作,也就是为什么叫做二级索引的原因。

特点

  • InnoDB根据用户指定的字段创建的索引。
  • B+树中同层级节点按照指定的索引字段进行排序。
  • B+树中非叶子节点存储的对应数据页中最小的索引字段的的信息、对应的主键信息、对应的页码信息。
  • B+树中叶子节点存储的就是索引字段信息、对应的主键信息。

其中存储目录信息的数据页,也就是非叶子节点为什么还需要存储主键信息呢?

是因为方便处理索引字段对应的值相同时引发的问题,在索引字段值相同时,他们无法进行有效的排序,简单来说就是需要确保存储的目录信息的数据页的User Record中每条记录的唯一性,当索引字段对应的值相同时,再按照主键的值进行排序。

唯一索引

唯一索引可以理解为特殊的二级索引,它们建立的索引结构与二级索引一致,唯一不同的是唯一索引对应的B+树是InnoDB自行创建,而非用户创建。

联合索引

联合索引也可以理解为特殊的二级索引,不同之处在于在联合索引中,先根据联合索引中前面的索引字段的值进行排序,遇到相同的值的话,再按照联合索引中下一个索引字段的值进行排序,当然,最后要是索引字段全部相同再以主键对应的值进行排序。

看到此处,开篇提出的问题相信已经得到解答了。

番外话

一般情况下,B+树的深度为4级就够了,为什么呢?

我们假设一下,对于16KB的数据页,可以存储真实数据为100条,而存储目录信息的数据为1000条。那么对于深度为4的B+树,可以存储多少条数据呢?

1000 * 1000 * 1000 * 100 = 100 000 000 000条记录,一般情况下,真实的数据不会都不会超过这么多,所以B+树深度一般都不会超过4。

InnoDB为什么使用B+树实现索引? InnoDB选择B+树作为索引结构,是经过多维度权衡后的最优解。相比哈希表、二叉树等结构,B+树能最大限度减少磁盘I/O:其"矮胖"特性使十亿级数据只需2-3次I/O;叶子节点链表支持高效范围查询;所有查询路径等长确保稳定性能;非叶子节点不存数据提升缓存效率;双向链表便于全表扫描。B+树在点查、范围查、排序等场景均表现优异,完美适配数据库的磁盘I/O特性,是平衡性能与功能的最佳选择。 阅读详情

相关推荐

一颗高度为3的B+树到底能存多少数据呢

1. 背景 同学在参加阿里面试的时候,被问到了B+树索引能存多少数据。这个问题挺有趣,要是对B+树不太了解,那么这个问题估计也不好回答 那么要回答这个问题,首先要知道B+树的结构是怎样的,存了什么数据,怎么存的,这些东西占多大等 先新建个表 CREATE TABLE IF NOT EXISTS `person`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, PRIMARY KEY ( `id` ) )ENGI

VitaminX181的博客 2375

B+树叶子结点到底存储了什么?

首先MYSQL默认InnoDB引擎,该引擎默认B+树;先说结论:B+树叶子结点存储的是主键KEY或者具体数据。分情况讨论: 主键KEY 比如说user_name是个索引,当执行该SQL:select * from user_info where `user_name` = 'xiaoming';InnoDB 就会建立 user_name 索引 B+树,节点里存的是 user_name 这个 ...

Alice_8899的博客 1万+

B树与B+树与Mysql innodb的B+树和其相关索引

如果您觉得有用的话,记得给,写作不易啊^ _ ^。而且听说,实在白嫖的话,那欢迎常来啊!!!

杨杨杨~~的博客 1480

MySQL索引-B+树

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。 索引在 MySQL 数据库中分三类: B+ 树索引 Hash 索引 全文索引 我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构。

jmlqqs的博客 1529

MySQL高频基本面试问题整理

总结大厂MySQL高频基本面试问题整理,用于快速查缺补漏

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

mysql InnoDB数据存储引擎 的B+树索引原理

一、InnoDB原理 在 InnoDB 中,每个索引其实都是一颗 B+ 树,主键索引也称作聚簇索引,其他非主键索引称作二级索引,每个表中每一行的记录值都完整的保存在主键索引的叶子节点上,二级索引的叶子节点保存的是主键的值。 每个表至少都有一个主键索引,而且表中所有的数据行都是存放在主键索引这个 B+ 树的叶子节点上的。如果你给表的其他字段加了索引的话,这个索引就是二级索引了,二级索引也是 B+ 树。 二级索引和主键索引的不同之处在于其叶子节点上保存的值不一样,表中所有字段的值都被完整的保存在主键索引的

Jack章臣的博客 706

【数据结构】深度解析B树、B+树、B*树数据结构特性与MySQL中InnoDB、MyISAM存储引擎差异

B树是一种适合外查找的平衡多叉树,常用于处理大量数据无法一次性加载到内存中的场景。与传统的二叉搜索树相比,B树通过降低树的高度来减少磁盘I/O次数,从而提高查找效率。B树的每个节点包含多个关键字和孩子指针,且所有叶子节点位于同一层。B树的插入操作通过分裂节点来保持平衡,确保树的高度尽可能低。B树的查找、插入和删除操作的时间复杂度均为O(logN),适合处理海量数据。相比哈希表,B树在极端情况下不会出现冲突问题,适合需要频繁查找和插入的场景。

2301_77509762的博客 1525

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3388

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

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

LIHONGYU的博客 2046

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 670

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1666

InnoDB的B+树索引:为什么一棵树能存2000万数据?

从一次"为什么我建了索引查询还是慢"的困惑出发,深度剖析InnoDB的B+树索引原理。通过数据页结构图解、页分裂与页合并的动画演示、以及一棵3层B+树能存多少数据的完整计算,揭秘为什么选B+树而不是B树、哈希、红黑树,以及为什么VARCHAR(255)这么常见。配合时序图展示查询流程,给出索引设计的最佳实践。

比较是偷走幸福的小偷 5219

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3354

为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树?(1)B+树空间利用率更高,可减少I/O次数一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。而因为B+树的内部节点只是作为索引使用,而不像B树那样每个节点都需要存储硬盘指针。也就是说:B+树中每个非叶节点没有指向某个关键字具体信息的指针...

AI天才研究院 1万+

项目管理中 PMO 的关键职能解析

在企业数字化转型与战略落地的浪潮中,PMO(Project Management Office,项目管理办公室)逐渐从“项目辅助角色”升级为“组织级战略执行中枢”。然而,多数人对PMO的认知仍停留在“管项目的部门”或“文档审核机器”的层面。本文将打破误解,通过生活化类比(如“中枢神经”“导航系统”)、流程图解(战略对齐循环)、实际案例(制造企业PMO升级),深入解析PMO的五大核心职能:战略对齐、流程标准化、资源管理、绩效监控、知识沉淀。最终揭示PMO的本质——

项目管理的博客 1248

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 896

MySQL 中 InnoDB 存储引擎使用的 B+树底层数据结构

内部节点:内部节点只包含键(keys)和到其子节点的指针(不包括数据项本身)。内部节点的主要功能是分派,即根据搜索条件引导查询到正确的叶子节点。叶子节点:叶子节点包含所有数据值以及相应的键。在 B+树中,数据仅存储在叶子节点中,并且叶子节点通常是双向链接的,这支持快速的顺序访问。介绍 InnoDB 中的页(通常大小为 16KB)如何用于存储 B+树的节点。InnoDB 存储引擎中,数据是以页(Page)为单位组织的,页是基本的磁盘I/O操作单位。

www_tlj的专栏 2817

PCL实现STL文件读取和转换为PCD格式

本文介绍如何使用点云库(Point Cloud Library,PCL)读取STL(Standard Triangle Language)文件,并将其转换为点云数据(PointCloud Data,PCD)格式。通过将STL文件转换为PCD格式,我们可以更方便地处理和分析点云数据。本文介绍了如何使用PCL库读取STL文件并将其转换为PCD格式的点云数据。以上是关于PCL读取STL文件并转存为PCD格式的简要介绍和示例源代码。下面的示例展示了如何将STL文件转换为PCD格式。函数将点云数据保存为PCD文件。

ByteEchoX的博客 800

浅析——B树,B+树,B*树以及分析MySQL的两种引擎

接触到了数据结构当中的B树,B+树,B*树,我觉得应该写一篇博客记录下,毕竟是第一次接触的,只有写了博客以后,感觉对这个的印象才会更加深刻。 前言: 为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?这个要从几个方面来说了, 计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 所以当你用红黑树的时

宇哲 1万+

python pyusb与硬件 下位机通信

python pyusb 与硬件 下位机 通讯

yuhang01的博客 945

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL深度剖析-InnoDB索引与B+树

文章主要介绍了 MySQL 中 InnoDB 索引与 B+树的相关知识。包括 B+树的概念、特点、核心特性;为何 MySQL 选择 B+树作为索引的数据结构;贯穿全文的索引数据例子;聚簇索引、二级索引、联合索引的概念、特征、图例解析;数据页中的槽与记录中的 next_record;B+树索引黄金法则;索引优化实战策略、注意事项和使用禁忌。

Anarkh_Lee的博客 1410

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

B树和B+树

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 B树和B+树前言一、B树和B+树的区别二、不同数据库引擎中B+树的差异 前言 填之前文章的坑,就聊一聊主要区别吧。 面试官:B树和B+树有什么区别?聊一聊吧。 一、B树和B+树的区别 B树的每个节点存储了key和data,key是一条数据记录的键值 ,是唯一的,data存储的是数据记录除key以外的数据。而B+树只在叶子节点存储data数据,这样非叶子节点就能存储更多的key。所以B+树相较于B树来说更加的矮胖,因为索引树很大不能一

weixin_43256529的博客 8213

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【数据结构】B树,B+树,B*树

B树的插入,B+树的插入,B*树

The porters of knowledge 2504

b树与b+树的区别_数据结构之B树与B+树区别

维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在...

weixin_39966602的博客 8809

MySQL中InnoDB索引数据结构(B+树)详解

MySQL的索引结构为什么是B+树?而不是其他。 MySQL中InnoDB索引数据结构(B+树)详解,包括二叉查找树,平衡二叉树,B树和B+树的讲解

weixin_45606985的博客 3808

【C++高阶数据结构】B树、B+树、B*树

🏆​ 🌈⭐️⚡若有帮助可以【关注】,大家一起进步!

YQ20210216的博客 1101
上一篇: Ubuntu使用root用户远程登录
yipengup
博客等级 码龄12年 10粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值