MySQL底层存储B-Tree和B+Tree原理分析

news2024/12/23 14:38:01

1.B-Tree的原理分析

(1)什么是B-Tree

  • B-树,全称是 Balanced Tree,是一种多路平衡查找树。

  • 一个节点包括多个key (数量看业务),具有M阶的B树,每个节点最多有M-1个Key。

  • 节点的key元素个数就是指这个节点能够存储几个数据。

  • 每个节点最多有m个子节点,最少有M/2个子节点,其中M>2。

  • 数据集合分布在整个树里面,叶子节点和非叶子节点都存储数据;类似在整个树里面做一次二分查找。

  • B 树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data)。

  • 实际业务中B树的阶数一般大于100,存储大量数据,B树高度也会很低,查询效率会更高。

  • 备注

    • 每个节点拥有最多的子节点,子节点的个数一般称为阶。

    • 阶:m阶是代表每个节点最多有m个分支(子树)。

    • 树的度:这棵树里面节点最大的度。

    • 节点的度:当前节点有几个子节点。

在这里插入图片描述

(2)B树插入原理

  • 每个节点的数据都是顺序存储,具有M阶的B树,树的阶数表示每个结点最多可以有多少个子结点

在这里插入图片描述

(3)B树的应用场景

  • 在数据库中,B树用来维护索引,用来提高查询效率,一个节点可以存储整个页(即磁盘块)
  • 在文件系统中,B树用来存储文件的目录信息,提高文件的访问效率
  • 在操作系统中,B树可以用来存储内存管理信息,提高内存的分配效率

(4)思考:3层的B树,阶数为1024,最多容纳多少个元素?

  • B树的阶数表示每个结点最多可以有多少个子结点,因此B树的阶数为1024,表示每个结点最多可以有1024个子结点

  • 由于B树的3层,因此根结点可以有1024个子结点,每个子结点又可以有1024个子结点

  • 因此一个3层的B树,阶数为1024,B树的每一层的节点数都是阶数的幂次方

  • 计算总容量 把每一层的节点数相加 即10241+10242+1024^3 大约是 11亿个节点,假如每个节点放一个元素就是11亿个

  • 所以在10亿个数据中找目标值,常规小于3次磁盘IO即可找到目标值,比平衡二叉树的30次提升了不少

    • 平衡二叉树的高度就等于每次查询数据时磁盘 IO 操作的次数。

    • 10亿的数据量,log2(N)约等于30次磁盘IO,

      • log2(N) 相当于2的多少次方(立方)等于N,例:log2 (8)= 3
      • 2的30次方=1073741824,所以就是30次磁盘IO

2.B+Tree的原理分析

(1)什么是B+Tree

  • 是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,同等存储空间下比B-Tree存储更多key
  • 非叶子节点不对关键字记录的指针进行保存,只进行数据索引 , 树的层级会更少 , 所有叶子节点都在同一层,
  • 叶子节点的关键字从小到大有序排列,叶子节点之间用指针连接, 构成有序链表(稠密索引)
  • B+树上每个非叶子节点之间是一个双向链表进行链接,而叶子节点中的数据都是使用单向链表链接
  • 查找特点
    • 当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找
    • 继续沿着关键字的指针向下,每次查询必须到叶子节点才能真正获取到相关数据
    • B+Tree叶子节点相连接,对树的遍历就是只需要 一次线性遍历叶子节点
    • 由于叶子节点的数据是顺序排列,方便区间查找
    • 在B+树完成范围查找,排序查找,分组查找,去重查找 比B树效率也比较高

在这里插入图片描述

(2)B+Tree插入流程解析

在这里插入图片描述

  • 总结

    • B树和B+树的最大区别在于非叶子节点是否存储数据

    • B+树非叶子节点只是当索引使用,同等空间下B+树存储更多key

    • B树,非叶子节点和叶子节点都会存储数据,找到对应节点就有对应的数据

    • B+树, 只有叶子节点才会存储数据,存储的数据都是在一行上,找到非叶子节点的key,还需要继续找到叶子节点才可以获取数据

    • B树的节点包括了key-value,所以找到对应的key即可找到对应的value,不用在继续寻找

    • 两种树各有优缺点和应用场景

3.B+Tree树应用之Mysql索引底层原理剖析

  • 背景

    • Mysql数据库是大家用最多的,查询是最高频使用的操作

    • 在多数数据库的设计里面,会用B-Tree或B+Tree做索引提高查询效率

  • 基于一张数据库的表数据进行查询(类似mysql的user表)

  • 构建索引:id用做key,然后data是数据的存储地址

内存地址idphonenameAge
0xFS84313820835467张三43
0xER98415738235423李四20
0x32421212152354223王五18
0x93100012152356324赵六30
0xAP234118735622097李祥19
0xSQ… 1千万条数据
  • 精确查找 id=2341的数据 select * from user where id = 2341

    • 未使用索引

      • 自上而下查找数据,一行行遍历,5次才找到数据
    • 使用索引

      • id建立主键索引(B+Tree结构),对应的数据存储数据的地址,2次找到数据,且数据量越多效果越明显
      • 根节点是常驻内存的,不需要进行IO操作
  • 范围查找 id>1000 和 id < 4212 的用户

    • 未使用索引

      • 自上而下查找数据,一行行遍历
    • 使用索引

      • id建立主键索引(B+Tree结构),由于本身是有序链表,所以顺序查找即可
  • Mysql的InnoDB中的索引结构与MyISAM的索引结构的区别

  • InnoDB引擎,表数据文件按B+Tree组织的,叶节点data域保存完整行数据, 树上的key就是主键, 以主键构建的B+树索引

    • 这种索引叫做聚集索引(聚簇索引 clustered index)

    • 聚簇索引一般为主键索引,而主键一个表中只能有一个,所以聚集索引一个表只能有一个

    • 聚簇索引叶子节点存储的是行数据,而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)

  • MyISAM引擎:索引文件和数据文件是分开的,索引结构的叶子节点放的是指向数据的主键(或者是地址)构建的B+树索引

    • 这种索引叫做非聚集索引、二级索引、辅助索引(非聚簇索引 nonclustered index)
    • 非聚集索引一个表可以存在多个
    • 叶子节点中保存的不是实际数据,而是主键,获得主键值后去聚簇索引中获得数据行
  • 注意

    • 非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID或记录的地址

    • 当使用非聚簇索引进行查询时,会得到一个主键 ID,再使用主键 ID 去聚簇索引上找真正的行数据,把这个过程称之为回表查询

    • 所以聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引

    • 非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID或记录的地址

    • 当使用非聚簇索引进行查询时,会得到一个主键 ID,再使用主键 ID 去聚簇索引上找真正的行数据,把这个过程称之为回表查询

    • 所以聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Andorid:关于Binder几个面试问题

1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机&#xff0c;系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯&#xff0c;则需要使用到内核空间做载体&#xff0c;内核空间是所有进程共享…

FL2440(S3C2440A 芯片) 开发板开发笔记

FL2440(S3C2440A 芯片) 开发板开发笔记 开发板的拨码开关指南&#xff1a; FL2440 改 vnfg 飞凌嵌入式 www. witech. com. cn 09. 8. 22 1 开发板使用手册 version4. 0 FL2440 保定飞凌嵌入式技术有限公司 网站&#xff1a;http: //www. witech. com. cn http: //www. he…

动态规划之买卖股票问题

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓动态规划之买卖股票问题 &#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 动态规划算法本质上就是穷举…

synchronized底层

Monitor概念一、Java对象头二、Monitor2.1、Monitor—工作原理2.2、Monitor工作原理—字节码角度2.2、synchronized进阶原理&#xff08;优化&#xff09;2.3、synchronized优化原理——轻量级锁2.4、synchronized优化原理——锁膨胀2.5、synchronized优化原理——自旋优化2.6、…

VUE3-Cesium(加载GeoJSON数据)

目录 一、准备工作 1、新建vue项目 解决报错&#xff1a;使用nvm后找不到vue -V找不到版本 2、安装Cesium插件 3、安装 Element Plus、unplugin-vue-components 和 unplugin-auto-import 4、按需自动导入element-plus 测试按需自动导入element-plus是否配置成功 二、项…

2023年软考中级电子商务设计师考什么?

首先&#xff0c;电子商务设计师属于软考中级&#xff0c;因此难度也不是特别大。但并不是说就完全没有难度&#xff0c;难度还是有的&#xff0c;像上午题一般把基本知识点掌握了&#xff0c;是没什么问题的&#xff0c;重点就在于下午题会比较难。 接下来我们来剖析一下考试…

408考研计算机之计算机组成与设计——知识点及其做题经验篇目1:RAM与ROM

目录 一、RAM 1、特点 2、分类 ①SRAM ②DRAM 二、ROM 1、特点 2、分类 可能是小编的学习风格和大家的不一样&#xff0c;小编喜欢由难到易的学习风格&#xff0c;所以在408计算机考研的四门课中&#xff0c;先选择了最难的计算机组成与设计进行学习。近…

【C++】初识类和对象

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、面向过程和面向对象初步认识二…

Spring核心模块—— BeanFactoryPostProcessorBeanPostProcessor(后处理器)

后置处理器前言Spring的后处理器BeanFactoryPostProcessor&#xff08;工厂后处理器&#xff09;执行节点作用基本信息经典场景子接口——BeanDefinitiRegistryPostProcessor基本介绍用途具体原理例子——注册BeanDefinition使用Spring的BeanFactoryPostProcessor扩展点完成自定…

Linux安装minio单机版

说明&#xff1a;因为前面记录了一下minio的使用&#xff0c;这里说一下minio的安装&#xff0c;只是单机版哦 环境准备&#xff1a;Linux系统 说明图&#xff1a; 1.创建文件夹命令 我的是安装在/usr/local 文件夹下面的创建文件夹命令 #进入目标文件夹 cd /usr/local#创建…

5 GateWay断言Predicate

每一个Predicate的使用&#xff0c;可以理解为&#xff1a;当满足条件后才会进行转发&#xff0c;如果十多个&#xff0c;那就是满足所有条件才会转发 断言种类 After&#xff1a;匹配在指定日期时间之后发生的请求。Before&#xff1a;匹配在指定日期之前发生的请求。Betwee…

常见摄像头接口USB、DVP、MIPI接口的对比

常见摄像头接口DVP、MIPI、USB的比较 引言 摄像头传感器已经广泛用于嵌入式设备了&#xff0c;现在的手机很多都支持多个摄像头。 在物联网领域&#xff0c;摄像头传感器也越来越被广泛使用。今天就来简单聊一聊几种常见的摄像头接口。 传感器与主控设备进行通信&#xff0…

基于S32K148快速调试TJA1101

文章目录1.前言2.TJA1101简介3.TJA1101调试3.1 硬件3.1.1 整体框图3.1.2 评估板3.1.2.1 参考原理图3.1.2.2 引脚说明3.1.3 转接板3.1.3.1 参考原理图3.1.3.2 模式配置3.1.3.3 原理介绍3.2 软件3.2.1 物理层&#xff08;TJA1101&#xff09;&#xff1a;3.2.2 数据链路层&#x…

05_Pulsar的主要组件介绍与命令使用、名称空间、Pulsar的topic相关操作、Pulsar Topic(主题)相关操作_高级操作、

1.5.Apache Pulsar的主要组件介绍与命令使用 1.5.1.多租户模式 1.5.1.1. 什么是多租户 1.5.1.2.Pulsar多租户的相关特征_安全性&#xff08;认证和授权&#xff09; 1.5.1.3.Pulsar多租户的相关特性_隔离性 1.5.1.4.Pulsar多租户的相关操作 1-获取租户列表 2-创建租户 3-获取配…

RocketMQ单机安装与启动

RocketMQ单机安装与启动系统要求下载地址安装步骤RocketMq启动NameServer查看是否启动成功启动BrokerProxy查看是否启动成功修改tool.sh测试消息产生消息的消费关闭服务器系统要求 下载地址 官网下载地址 二进制包是已经编译完成后可以直接运行的&#xff0c;源码包是需要编译…

Vant2 源码分析之 vant-sticky

前言 原打算借鉴 vant-sticky 源码&#xff0c;实现业务需求的某个功能&#xff0c;第一眼看以为看懂了&#xff0c;拿来用的时候&#xff0c;才发现一知半解。看第二遍时&#xff0c;对不起&#xff0c;是我肤浅了。这里侧重分析实现原理&#xff0c;其他部分不拓展开来&…

轮转数组(每日一题)

目录 一、题目描述 二、题目分析 2.1 方法一 2.1.1 思路 2.1.2 代码 2.2 方法二 2.2.1 思路 2.2.2 代码 2.3 方法三 2.3.1 思路 2.3.2 代码 一、题目描述 oj链接&#xff1a;https://leetcode.cn/problems/rotate-array 给定一个整数数组 nums&#xff0c;将数组中的…

GDScript 导出变量 (Godot4.0)

概述 导出变量的功能在3.x版本中也是有的&#xff0c;但是4.0版本对其进行了语法上的改进。 导出变量在日常的游戏制作中提供节点的自定义参数化调节功能时非常有用&#xff0c;除此之外还用于自定义资源。 本文是&#xff08;Bilibili巽星石&#xff09;在4.0官方文档《GDScr…

手把手创建flask项目

Flask 框架流程 什么是Flask&#xff1a; Flask诞生于2010年, 使用python语言基于Werkzeug工具箱编写的轻量级Web开发框架 Flask本身相当于一个内核, 其他几乎所有的功能都要用到扩展(邮件:Flask-Mail, 用户认证:Flask-Login, 数据库:Flask-SQLAlchemy). Flask的核心在于Werkz…

在线图书借阅网站( Python +Vue 实现)

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、图书详情页、用户中心模块。后台功能包括&#xff1a;总览、借阅管理、图书管理、分类…