【MYSQL】MYSQL 的学习教程(五)之 MySQL 索引底层:B+ 树详解

1. 树

树跟数组、链表、堆栈一样,是一种数据结构。它由有限个节点,组成具有层次关系的集合。因为它看起来像一棵树,所以得其名。一颗普通的树如下:

在这里插入图片描述

关于树的概念:

  • 结点的度:一个结点含有的子结点个数称为该结点的度
  • 树的度:一棵树中,最大结点的度称为树的度;
  • 父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
  • 深度:对于任意结点n,n的深度为从根到n的唯一路径长,根结点的深度为0;
  • 高度:对于任意结点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

2. 树的种类

在这里插入图片描述

按照有序性,可以分为有序树和无序树:

  • 无序树:树中任意节点的子结点之间没有顺序关系
  • 有序树:树中任意节点的子结点之间有顺序关系

按照节点包含子树个数,可以分为 B 树和二叉树,二叉树可以分为以下几种:

  • 二叉树:每个节点最多含有两个子树的树称为二叉树;
  • 满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树;

在这里插入图片描述

  • 完全二叉树:如果一颗二叉树除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布

在这里插入图片描述
在这里插入图片描述

  • 二叉查找树(为了提高查找效率):首先它是一颗二叉树,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树;
    • 红黑树:红黑树是一颗特殊的二叉查找树,每个节点都是黑色或者红色,根节点、叶子节点是黑色。如果一个节点是红色的,则它的子节点必须是黑色的【HashMap 在处理哈希冲突严重时,拉链过长导致查找效率降低,就引入了红黑树】

在这里插入图片描述

在最好的情况下,二叉排序树的查找效率比较高,是 O(logn),其访问性能近似于折半查找;

最差时候会是 O(n),比如插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行

在这里插入图片描述

  • 平衡二叉树(AVL:为了保证树不至于太倾斜,尽量保证两边平衡):是一种二叉排序树。一 棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。它有几种实现方式:红黑树、AVL树
    • AVL 树:本质上还是一棵二叉搜索树,每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1
      在这里插入图片描述
    • 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。因而,红黑树是相对接近平衡的二叉树,并不是一个完美平衡二叉查找树

在这里插入图片描述

  • 霍夫曼树:带权路径最短的二叉树

一文带你搞定【二叉树】

3. B- 树、B+ 树简介

先看几个概念:

  • 阶数:一个节点最多有多少个孩子节点。(一般用字母m表示)
  • 关键字:节点上的数值就是关键字
  • 度:一个节点拥有的子节点的数量。

3.1 B-树 简介

B- 树(B树)是一种平衡的多叉树,它比较适用于对外查找

  1. 一颗 m 阶的 B- 树,有以下特征:
  2. 根结点至少有两个子女;
  3. 每个非根节点所包含的关键字个数 j 满足:⌈m/2⌉ - 1 <= j <= m - 1.(⌈⌉表示向上取整)
  4. 有k个关键字(关键字按递增次序排列)的非叶结点恰好有k+1个孩子。
  5. 所有的叶子结点都位于同一层
  6. 每个节点既保存索引,又保存数据

在这里插入图片描述

3.2 B+ 树简介

B+树是B-树的变体,也是一颗多路搜索树

一棵m阶的B+树主要有这些特点:

  1. 每个结点至多有m个子女;
  2. 非根节点关键值个数范围:m/2 <= k <= m-1
  3. 相邻叶子节点是通过指针连起来的,并且是关键字大小排序的。
  4. 只有叶子节点保存数据
  5. 增加了相邻接点的指向指针

在这里插入图片描述

B+ 树和 B- 树的主要区别如下:

  1. B 树的每个节点包含键和对应的值,而 B+ 树的非叶子节点只包含键,所有的值都存储在叶子节点中(其所有叶子结点的数据组合起来就是完整的数据)
  2. 由于 B+ 树的叶子节点形成了有序链表,范围查询和顺序遍历操作更加高效。在 B 树中,为了找到满足范围查询的键,需要进行额外的搜索操作
  3. 在 B 树中,叶子节点存储了所有的键和对应的值,而在 B+ 树中,叶子节点只存储键和相关值的引用(或指针)。这使得B+树的叶子节点可以容纳更多的键,提高了存储空间的利用率
  4. B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同,所以查询速度要比B树更稳定(B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径)
  5. B+树遍历整棵树只需要遍历所有的叶子节点即可,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描
  6. B- 树中任何一个关键字出现且只出现在一个结点中,而 B+ 树可以出现多次

3.3 B+ 树的查找

因为 B+ 树的数据都是在叶子节点上的,非叶子节点只是指针索引的作用,因此,查找过程需要搜索到叶子节点上。以这颗 B+ 树为例吧:

在这里插入图片描述

3.3.1 B+ 树单值查询

假设我们要查的值为32

第一次磁盘 I/O,查找磁盘块 1,即根节点(36,43),因为 32 小于36,因此访问根节点的左边第一个孩子节点

在这里插入图片描述

第二次磁盘 I/O, 查找磁盘块 2,即根节点的第一个孩子节点,获得区间 (28,32),遍历即可得 32

在这里插入图片描述

3.3.2 B+ 树范围查询

假设我们要查找区间 [32,40] 区间的值

第一步先访问根节点,发现区间的左端点 32 小于 36,则访问根节点的第一个左子树(28,32)

在这里插入图片描述

第二步访问节点(28,32),找到 32,于是开始遍历链表,把 [32,40] 区间值找出来,这也是 B+ 树比 B- 树高效的地方

在这里插入图片描述

4. B+ 树经典面试题

4.1 InnoDB一棵 B+ 树可以存放多少行数据?

这个问题的简单回答是:约 2千万 行

  • 在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是 512 B
  • 文件系统中,最小单位是块,一个块大小就是 4 KB
  • InnoDB存储引擎最小储存单元是页,一页大小就是 16 KB

在这里插入图片描述

因为 B+ 树叶子存的是数据,内部节点存的是键值 + 指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而再去数据页中找到需要的数据;

在这里插入图片描述

假设 B+ 树的高度为 2 的话,即有一个根结点和若干个叶子结点。这棵 B+ 树的存放总记录数为 = 根结点指针数 * 单个叶子节点记录行数

  • 如果一行记录的数据大小为 1KB,那么单个叶子节点(一页)可以存的记录数 = 16K / 1K = 16
  • 非叶子节点内存放多少指针呢?我们假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoD B源码中设置为 6 B,所以就是 8+6 =14 B,16K / 14B = 16 * 1024B / 14B = 1170

在这里插入图片描述

因此,一棵高度为 2 的 B+ 树,能存放 1170 * 16=18720 条这样的数据记录。

同理一棵高度为 3 的 B+ 树,能存放 1170 *1170 *16 =21902400,也就是说,可以存放两千万左右的记录。B+ 树高度一般为1-3层,已经满足千万级别的数据存储

4.2 为什么索引结构默认使用 B+ 树,而不是 B-Tree,Hash 哈希,二叉树,红黑树?

  • Hash哈希,只适合等值查询,不适合范围查询。
  • 一般二叉树,可能会特殊化为一个链表,相当于全表扫描。
  • 红黑树,是一种特化的平衡二叉树,MySQL 数据量很大的时候,索引的体积也会很大,内存放不下的而从磁盘读取,树的层次太高的话,读取磁盘的次数就多了。
  • B-Tree,叶子节点和非叶子节点都保存数据,相同的数据量,B+树更矮壮,也是就说,相同的数据量,B+树数据结构,查询磁盘的次数会更少

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

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

相关文章

C/C++ 块作用域的静态变量static的应用

块作用域的静态变量 静态变量(static variable)听起来自相矛盾&#xff0c;像是一个不可变的变量。实际上&#xff0c;静态的意思是该变量在内存中原地不动&#xff0c;并不是说它的值不变。具有文件作用域的变量自动具有&#xff08;也必须是&#xff09;静态存储器。创建的具…

小红书kos和kop有什么区别,营销玩法有哪些

相信熟悉媒介传播的朋友&#xff0c;对于kol和koc都不陌生。但随着平台的发展和市场的进步&#xff0c;又出现了kos和kop。那么小红书kos和kop有什么区别&#xff0c;营销玩法有哪些&#xff1f; 一、什么是kos和kop KOS&#xff0c;全称叫做Key Opinion Sales&#xff0c;意思…

数据恢复工具推荐!这3款堪称删除文件恢复大师!

“快看看我&#xff01;经常都会莫名奇妙丢失各种电脑文件&#xff0c;但是又无法通过简单的方法找回重要的数据&#xff0c;有没有什么简单的操作可以帮助我快速恢复数据的呀&#xff1f;非常感谢&#xff01;” 在我们的日常生活中&#xff0c;无论是工作还是学习&#xff0c…

搭载紫光展锐芯的移远通信RedCap模组顺利通过中国联通OPENLAB实验室认证

近日&#xff0c;移远通信联合紫光展锐在中国联通5G物联网OPENLAB开放实验室&#xff0c;完成了RedCap模组RG207U-CN端到端测试验收&#xff0c;并获颁认证证书。移远通信RG207U-CN成为业内率先通过联通OPENLAB认证的紫光展锐RedCap芯片平台的模组。 本次测试基于联通OPENLAB实…

千呼万唤始出来!《繁花》定档央八

各位久等&#xff01; 冰雪消融&#xff0c;繁花倾情绽放 央八好戏&#xff0c;即将开场 12月27日19:30起 电视剧《繁花》 登陆CCTV-8黄金强档 接下来 随宝总一起回到九十年代的上海 上世纪九十年代初 煌煌大时代&#xff0c;人人争上游 青年阿宝拜商界高手爷叔为师 左…

山海鲸开发者解读智慧电力

作为山海鲸可视化软件的开发者&#xff0c;我们深知可视化技术在智慧电力领域的重要性。在这个能源紧缺、环保意识日益增强的时代&#xff0c;在开发免费好用的可视化软件同时&#xff0c;我们也希望通过数字孪生技术为智慧电力领域提供高效、智能的解决方案&#xff0c;推动电…

若依框架跑起来,Java小白入门(一)

背景 本人Java小白&#xff0c;有一点编程基础&#xff08;c#&#xff09;。企业数字化建设大环境是JAVA&#xff0c;所以需要搞起来&#xff0c;而学习最快的方式就是读代码&#xff0c;学以致用干项目。所以这个系列就是从小白看能否变成小黑。码云上有很多框架&#xff0c;…

剑指Offer 队列栈题目集合

目录 用两个栈实现队列 用两个栈实现队列 刷题链接&#xff1a; https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6 题目描述 思路一&#xff1a; 使用两个栈来实现队列的功能。栈 1 用于存储入队的元素&#xff0c;而栈 2 用于存储出队的元素。 1.push…

Java|IDEA 中添加编译参数 --add-exports

方法1 File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Javac Options > Override compiler parameters per-module 点击&#xff1a; 点击OK 双击Compliation options&#xff0c;输入后回车&#xff1a; 方法2 找到出错…

KubeSphere应用【五】发布镜像至Harbor

一、IDEA发布镜像至Docker 1.1IDEA安装Docker插件 1.2配置Docker服务器地址 1.3编写POM.XML文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

Tg2520smn ((tcxo / vc-tcxo)高稳定性)

TG2520SMN是一款高稳定性的(TCXO/VC-TCXO)产品&#xff0c;其频率输出范围为10MHz至55MHz&#xff0c;提供多种电源电压选项&#xff0c;分别为1.8 V类型、2.8 V类型、3.0 V类型和3.3 V类型&#xff0c;该产品具备优异的频率/温度特性&#xff0c;最大的频率稳定性为0.5 10^6 …

SpringIOC之BeanFactoryResolver

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

智能感知时代已来,汉威科技柔性传感器迎来发展新机遇

近年来&#xff0c;消费电子、医疗健康、智能汽车、人机交互等领域的黑科技产品不断出现&#xff0c;催生了许多新功能、新场景、新市场。 TWS耳机&#xff1a;许多TWS&#xff08;真无线立体声&#xff09;耳机厂商开始摒弃传统的触摸感应模式&#xff0c;转而采用最先进的压…

【算法刷题】Day22

文章目录 1. 按摩师题干&#xff1a;算法原理&#xff1a;&#xff08;dp&#xff09;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 寻找数组的中心下标题干&#xff1a;算法原理&#xff1a;&#xff08;前缀和&#xff09;代码…

vue 简单实现购物车:商品基础信息最终的 html 文件 + 商品计数器的组件处理,实现了购物车;

购物车实现过程&#xff1a; Ⅰ、商品购物车作业需求&#xff1a;1、商品购物车页面示例&#xff1a;2、具体需求&#xff1a; Ⅱ、html 文件的构建&#xff1a;商品购物车.html Ⅲ、组件文件的构建&#xff1a;商品购物车1.js Ⅳ、小结&#xff1a; Ⅰ、商品购物车作业需求&am…

百度侯震宇详解:大模型将如何重构云计算?

12月20日&#xff0c;在2023百度云智大会智算大会上&#xff0c;百度集团副总裁侯震宇以“大模型重构云计算”为主题发表演讲。他强调&#xff0c;AI原生时代&#xff0c;面向大模型的基础设施体系需要全面重构&#xff0c;为构建繁荣的AI原生生态筑牢底座。 侯震宇表示&…

Go语言与HTTP/2协议的实践探索

随着互联网技术的发展&#xff0c;HTTP/2协议逐渐成为主流。Go语言作为一种高效、简洁的编程语言&#xff0c;与HTTP/2协议的结合具有很大的潜力。本文将探讨Go语言与HTTP/2协议的实践探索。 一、HTTP/2协议的优势 HTTP/2协议相比HTTP/1.1协议&#xff0c;具有以下优势&#…

浅谈ASO优化如何应对市场竞争的挑战

随着应用市场的竞争越来越激烈&#xff0c;ASO优化也要为了应对各种来临的风险与机遇做出改变&#xff0c;提高自己的适应能力&#xff0c;下面小柚整理了一些思路供大家参考。 1. 深入了解目标用户需求&#xff1a;首先&#xff0c;需要深入了解目标用户的需求和痛点&#xf…

Qt 6.3 学习笔记

文章目录 Qt的安装和配置创建一个Qt项目信号和槽布局和控件绘图和动画数据库和网络 Qt是一个跨平台的C图形用户界面应用程序开发框架。它提供了创建GUI应用程序的工具和库。Qt 6.3是Qt的最新版本&#xff0c;引入了许多新特性和改进。在这个章节中&#xff0c;我们将详细介绍如…

单片机原理及应用:Keil μVision4和Proteus 8的配置介绍

笔者所在的专业最近开设了单片机课程&#xff0c;对笔者而言&#xff0c;虽然之前有一定的代码基础。但还是第一次面对既要求代码架构又要求电路仿真的领域。为了巩固知识和增强记忆&#xff0c;特此创建了这个专栏&#xff0c;谨以一名非电专业初学者的身份记录和分享知识。 …