详解MySQL数据库索引实现机制 - B树和B+树

news2024/9/27 5:50:17

详解MySQL数据库索引实现机制 - B树和B+树

  • 1.索引的出现
  • 2.hash算法的缺点
  • 3.二叉排序树BST
  • 4.平衡二叉树AVL
  • 5.红黑树
  • 6.B树诞生了
  • 7.B+树

1.索引的出现

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构☹️

在这里插入图片描述


2.hash算法的缺点

基于索引的设计,其实有很多思路,比如最早期使用的数组查找,这种方法效率极低

后来针对数组的缺点改进使用了hash算法,但是我们发现,hash算法对于等值查询可以,但是遇到范围查询,得挨个遍历,hash就不合适了

在这里插入图片描述

试想一种情况:

SELECT * FROM tb1 WHERE id < 500;

Hash 索引是根据 hash 算法来定位的,难不成还要把 1 - 499 的数据,每个都进行一次 hash 计算来定位吗?这就是 Hash 最大的缺点了。


3.二叉排序树BST

终于我们找到了实现索引最好的方法,那就是:树

如果我们想基于树进行索引查找,首先普通的二叉树肯定是不行的,所以我们引入一种二叉排序树BST

BST插入数据的时候得有序,必须保证:

  1. 若左子树不为空,则左子树上所有结点的值都小于根结点的值
  2. 若右子树不为空,则右子树上所有结点的值都大于根结点的值

在这里插入图片描述

这样,查找的算法时间复杂度就变为了LogN级别

但是,请试想如果一组数据的树组成了这样的结果:

在这里插入图片描述

很遗憾,查询的效率又退回到了LogN级别,针对于这种致命的缺点,我们又改进了索引的算法,那就是大名鼎鼎的平衡二叉树AVL!


4.平衡二叉树AVL

AVL算法可以保证插入数据的时候得保持二叉排序树平衡

左子树和右子树高度之差的绝对值不大于1🙁

在这里插入图片描述

这种算法的本质是用插入的成本来弥补查询的效率,适用于插入情况特别少,但是查询情况特别多的数据!

但是一且出现,插入操作比查询操作多的情况下,AVL算法就不合适了!所以我们继续尝试改进,就引入了神秘莫测的红黑树!


5.红黑树

红黑树规定:最长子树不超过最短子树的2倍即可,这样可以极大的减少插入数据的算法开销

在这里插入图片描述

但是其实对于红黑树作为索引实现机制也有着一定的问题:随着数据的插入,发现树的深度会变深(海量数据的情况下),意味着IO次数越多,影响读取的效率

那么如何针对红黑树再做改进呢?这时有大佬发现,红黑树深度变深的本质是这是一颗二叉树,而二叉树会随着数据量的增大很快的进行递增深度,那么如果这是一颗多叉的树,这个问题不就迎刃而解了吗?于是B树诞生了!

传统二叉树:

在这里插入图片描述

B树:

在这里插入图片描述


6.B树诞生了

B树就是一个有序的多路平衡查询树😖

m叉树的结构:

  1. 树中每个结点至多有m个孩子结点(即至多有m-1个关键字)
  2. 每个节点的结构为
    在这里插入图片描述
    其中n表示当前节点的孩子节点的个数,Px表示第x个孩子节点的指针地址,Kx表示第x个关键字(关键字是用来判断子节点的区间的)
  3. 除根节点外,其他结点至少有m/2个孩子结点
  4. 若根节点不是叶子结点,则根结点至少有两个孩子结点
  5. 所有叶子结点都在同一层上,即树是所有结点的平衡因子均等于0的多路查找树

例:m=4的4阶B树

在这里插入图片描述

但是诸位思考,这种索引检索方式是否依然存在着一些问题呢?

B树中每个节点都可以存放表的行记录数据,每个节点的读取可以视为一次I/O读取,树的高度表示最多的I/O次数,在相同数量的总记录个数下,每个节点的记录个数越多,高度越低,查询所需的I/O次数越少

在MySQL中一个innodb页就是一个B+树节点,而一个innodb页默认为16kb大小,请试想一下如果我们把数据库的行具体的数据都存到各个节点中,势必会导致树的深度很大,这样就又产生了类似红黑树的性能瓶颈问题!

于是各位大佬们就又产生了一个想法,是否我们可以这样解决B树的缺陷:在B树只有叶子节点存放 key 和 data,其他内节点只存放 key 的值,减少内节点每个节点的空间占用,这样每个节点就可以存放更多的记录数了!这就解决方法就是数据库索引的终极解决方案:B+树!


7.B+树

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用😞

一般情况下一个两层的B+树可以存2000万行左右的数据,然后通过利用B+树叶子节点存储了所有数据并且进行了排序,并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等SQL语句

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

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

相关文章

(Netty)Handler Pipeline

Handler & Pipeline ChannelHandler 用来处理 Channel 上的各种事件&#xff0c;分为入站、出站两种。所有 ChannelHandler 被连成一串&#xff0c;就是 Pipeline 入站处理器通常是 ChannelInboundHandlerAdapter 的子类&#xff0c;主要用来读取客户端数据&#xff0c;写…

【嵌入式处理器】CPU、MPU、MCU、DSP、SoC、SiP的联系与区别

1、CPU(Central Processing Unit) CPU(Central Processing Unit)&#xff0c;是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。众所周知的三级流水线&#xff1a;取址、译码、执行的对象就是CPU&#xff0c;差…

重学Android之View——TabLayoutMediator解析

重学Android之View——TabLayoutMediator解析 1.前言 在使用TabLayoutViewPager2Fragment的时候&#xff0c;查询别人的使用例子&#xff0c;看到了 TabLayoutMediator这个类&#xff0c;撰写此文&#xff0c;仅当学习思考&#xff0c;本文是在引用material:1.7.0的版本基础…

记2022年秋招经历

自我介绍求职体验求职心得 一、自我介绍 学历普通本科&#xff0c;专业是网络工程&#xff0c;在校期间学习主要的是计算机体系方面的知识&#xff0c;根据课程&#xff0c;自学过前端、后端等内容。包括前端三板斧(htmlcssjs)、常用的前端框架(bootstarp/Vue等&#xff09;&am…

Android项目接入React Native方案

本篇文章主要介绍在现有的Android项目中接入React Native的接入过程&#xff0c;分析接入过程中的一些问题和解决方案&#xff0c;接入RN的平台为Android&#xff0c;开发环境为Mac&#xff0c;开发工具为Android Studio。 一、环境配置 1、Android配置 因为是现有的Android项…

Vue实现DOM元素拖放互换位置

一、拖放和释放HTML 拖放接口使得 web 应用能够在网页中拖放文件。这里将介绍了 web 应用如何接受从底层平台的文件管理器拖动DOM的操作。拖放的主要步骤是为 drop 事件定义一个释放区(释放文件的目标元素) 和为dragover事件定义一个事件处理程序。触发 drop 事件的目标元素需要…

day20IO流

1.字符流 1.1为什么会出现字符流【理解】 字符流的介绍 由于字节流操作中文不是特别的方便&#xff0c;所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时&#xff0c;文本文件也会有中文&#xff0c;但是没有问题&#xff0c;原因是最…

数学建模-分类模型(SPSS)

目录 1.简介 2.样例-二元 1.对于预测结果不理想&#xff0c;在logistics模型里加入平方项交互项等。 2.如果自变量有分类变量&#xff08;如男女&#xff0c;行业有互联网行业、旅游行业……&#xff09; 3.分训练集、测试集 4.fisher线性判别分析 3.样例-多元 注意&…

【Nginx】使用Docker完成Nginx反向代理

本机是在CentOS7上面进行操作的 1.首先安装好Dokcer&#xff0c;这里不再赘述 2.Docker安装Nginx容器 2.1首先需要创建Nginx配置文件&#xff0c;之后完成挂载 启动前需要先创建Nginx外部挂载的配置文件&#xff08; /home/nginx/conf/nginx.conf&#xff09; 之所以要先创建…

Redis - Redis 6.0 新特性之客户端缓存

1. 为什么需要客户端缓存 antirez 写了一篇有关客户端缓存设计的想法&#xff1a;《Client side caching in Redis 6》。antirez 认为&#xff0c;Redis 接下来的一个重点是配合客户端&#xff0c;因为客户端缓存显而易见的可以减轻 Redis 的压力&#xff0c;速度也快很多。实…

Android从开机到APP启动流程——基于Android9.0

Android从开机到APP启动流程——基于Android9.0 一、 Zygote进程启动流程 二、 System Server启动流程 三、 ActivityManagerService启动流程 四、 Launcher App (Home Activity)启动流程 五、 Zygote fork()子进程&#xff0c;子进程入口为ActivityThread.main() 六、 Acti…

第02讲:使用kubeadm搭建k8s集群的准备工作

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/ kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具&#xff0c;这个工具能通过两条指令完成一个 kubernetes 集群的部署: 第1步、创建一个 Master 节点 kubeadm init第2步&#x…

记录一次mysql慢查询的优化过程

前言 业务上线后经常报查询超时&#xff0c;数据库使用的是阿里云的RDS&#xff0c;mysql版本是5.6.16-log&#xff0c;有几条统计数据的查询语句执行很慢&#xff0c;有的甚至执行一次需要10多秒&#xff0c;简直无法忍受。 查看了超时时间&#xff0c;默认为0 show variables…

【微信小程序-原生开发】实用教程03-自定义底部导航(含自定义tabBar导航高亮需点击两次的解决方案)

开始前&#xff0c;请先完成底部导航的开发&#xff0c;详见 【微信小程序-原生开发】实用教程02-添加全局页面配置、页面、底部导航 https://sunshinehu.blog.csdn.net/article/details/128705866 显然&#xff0c;纯文字的底部导航有点low&#xff0c;还是需要有图标的才酷…

新手编写IntelliJ IDEA插件

需求目的可能你会想什么场景会需要用到插件开发&#xff0c;其实插件开发算是一种通用的解决方案&#xff0c;由服务平台定义标准让各自使用方进行自需的扩展。这就像我们非常常用的 P3C 代码检查插件、代码审计插件、脚手架工程创建插件、自动化API提取插件、单元测试统计插件…

TOF相机国产、非国产统计参数对比分析

TOF相机国产、非国产统计参数对比分析 Kinect v2 Kinect v2是Microsoft在2014年发售的&#xff0c;如图1-1所示。相比于Kinect v1在硬件和软件上作出了很大的进化&#xff0c;且在深度测量的系统和非系统误差方面表现出更好的性能。 Kinect v2中一共有三个摄像头&#xff0c…

Linux学习笔记【part2】网络配置与远程登录

Linux基础篇学习笔记 1.网络连接模式 VMware 提供了三种网络连接模式&#xff1a; ① 桥接模式 桥接模式&#xff1a;虚拟机直接连接外部物理网络的模式&#xff0c;主机起到了网桥的作用。在这种模式下&#xff0c;虚拟机可以直接访问外部网络&#xff0c;并且对外部网络是…

vue3利用keepAlive缓存页面

场景介绍 项目中经常会有这么一个需求&#xff0c;一个表单页面&#xff0c;可能需要跳转其他页面拿到对应的数据&#xff0c;再跳回表单页面&#xff0c;但是之前填写过的数据还在。而某些页面跳这个表单页面的时候&#xff0c;是不需要缓存&#xff0c;因为他是新增&#xf…

通过Facebook建立反链:SEO角度

最近我有一个朋友的网站做得很不错&#xff0c;每天都在增加反链。反链对于网站来说&#xff0c;好处是显而易见的&#xff0c;能够提升搜索引擎对网站的认可度&#xff0c;增强用户对网站的信任度。另外一个方面的好处是&#xff0c;反链可以提高流量&#xff08;或者转化率&a…

想考个PMP证书,要怎么报考?

pmp 报考条件没他们说的那么难&#xff0c;什么 4500/7500 个小时的项目管理经验&#xff0c;这个条件看起来很难&#xff0c;其实项目无处不在&#xff0c;画一幅画&#xff0c;做一餐饭&#xff0c;都能算一个项目&#xff0c;这 4500个小时、7500 个小时很快就达到了。一、报…