为什么MySQL索引更适合B+树而不是二叉树、B树

news2024/10/6 14:25:31

概述:

在当今社会,程序员内卷非常的严重,如果没有过硬的技术,很难在众多的程序员中脱颖而出,例如,以前问数据库方面的知识,只会问些增删改查语句表面的东西,而如今却要问数据库底层的架构、索引原理及引擎等内容,本文就是面试官经常问到的问题:为什么MySQL索引更适合B+树而不是二叉树、B树。要回答这个问题,首先我们得了解什么是B+数、二叉树、B树。

一、什么是B树

  • B树是一种多路自平衡的搜索树,它类似普通的平衡二叉树,不同的是B树允许每个节点拥有更多的子节点。B-Tree相对于AVL Tree缩减了节点的个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。I/O渐进复杂度是O(h)。

  • 注意B-树就是B树,-只是一个符号。

  • 如图:如果要查找0014,就需要查询2次,虽然和红黑树的I/O渐进复杂度一样,但是红黑树结构,h明显要深得多。
    在这里插入图片描述
    深度理解:
    InnoDB存储引擎有页(Page)的概念,页是其磁盘管理的最新单位,innoDB存储引擎默认每个页面的大小为16KB,可通过参数innodb_page_size将页面的大小设置为4k、8K、16K,在mysql中可通过如下命令查看页面的大小

mysql> show variables like '%innodb_page_size%';

而系统一个磁盘块的存储空间往往没有这么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来到达页的大小16KB。innoDB在把磁盘数据读取到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于单位数据记录的位置,这将减少磁盘I/O的次数,提高查询效率。

总结:

B树可以看成平衡二叉树的扩展
1、每个节点最多有m个分支,最少分支数(根节点且不是叶子节点),至少有两个分支;最少分指数(非叶子节点非根节点),至少有两个m/2(向上取整)个分支
2、有n(k=<n<=m)个分支的节点有n-1个关键字,按递增排列,k=2(根),k=[m/2]非根非叶
3、节点内关键字各不相等
4、叶子节点处于同一层:可以用空指针表示,查找失败的位置

二、什么是B+Tree

B+树是B树的一种变形形式,B+树上的叶子节点存储关键字以及相应记录的地址,叶子节点以上各层作为索引使用。
一棵 M 阶的B+树定义如下:
1、每个节点至多有 M 个子树;
2、除根节点外,每个节点有ceil(M/2)至 M个子树,根节点至少有两个子树;
3、有 k 个子树的节点必有 k 个关键字。
4、叶子节点包含了全部关键字和数据指针,叶子节点内的关键字有序排列,叶子节点间也是有序排列,指针相连。
5、所有非叶子节点可以看成是索引,仅包含其子树中最大(或最小)关键字的值。
6、所有的叶子节点都位于同一层。

B+树的结构图:
在这里插入图片描述
根据上图我们来看下B+树和B树有什么不同。

1、在B树中,你可以将键和值存放在内部节点和叶子节点
2、在B+树中,内部节点都是键,没有值。叶子节点同时存放键和值
3、B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。

使用B+树的好处

1、B+树的内部节点只存放键,不存放值,一次读取可以在内存页种获取更多的键,可以更快的缩小查找范围
2、B+树的叶子节点 有一条链连着。当需要进行一次全部数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。
但是B树则需要对每一层进行遍历,需要多次内存置换,需要花费更多的时间。

数据库为什么使用B+树,而不是B树

数据库的数据读取需要进行巨大的磁盘IO操作。
需要【更快地缩小范围和更少的读取次数】,所以数据库选用B+树作为底层实现。

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

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

相关文章

【翻译一下官方文档】之uniapp的网络请求

uni.request(OBJECT) 发起网络请求。 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型headerObject否设置请求的 header&#xff0c;header 中不能设置 RefererApp、H5…

关于链表的题目—leetcode

第一题&#xff1a;删除链表中的指定节点 问题描述&#xff1a; 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点…

【redis】缓存预热雪崩穿透击穿

【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09; 文章目录 【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09;前言一、面试题二、缓存预热三、缓存雪崩发生原因预防&#xff0b;解决高可用&#xff1a;多缓存结合&#xff1a; 人民币玩家 四、缓存穿透是什么…

谷歌云端硬盘Drive批量下载大文件或大文件夹的稳定方法

本文介绍在谷歌云端硬盘&#xff08;Drive&#xff09;中&#xff0c;快速、稳定下载大文件、文件夹的方法。 在使用谷歌Drive下载文件或文件夹时&#xff0c;我们往往会遇到下载不稳定或失败的情况&#xff1b;在下载较大的文件或文件夹时&#xff0c;这一问题出现的频率更多。…

NLP语义识别在人工智能领域中的应用与前景

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中的一个重要分支&#xff0c;它致力于让计算机能够理解并处理人类自然语言。语义识别是NLP中的一个重要技术&#xff0c;它可以使计算机更好地理解人类语言的含义和意图。在本文中&#xff0c;我们将探讨NLP语义识别在人…

4月24号软件更新资讯合集.....

GoFrame v2.4 版本发布&#xff0c;企业级 Golang 开发框架 大家好啊&#xff0c;GoFrame 框架今天发布了 v2.4.0 正式版本啦&#xff01;&#x1f44f;&#x1f44f;&#x1f44f;&#x1f44f; 该版本最大的亮点在于提供了微服务开发的功能特性、开发工具以及工程脚手架&am…

第三章作业:关系数据库

第三章作业&#xff1a;关系数据库 目录 第三章作业&#xff1a;关系数据库选择题简答题1、关系代数&#xff1a;产生学生成绩表&#xff0c;包括学号、姓名、课程名、学分和成绩。题目代码 2、关系代数&#xff1a;检索选择了课程号为“C2"的学生学号和姓名。题目代码 3、…

月获2万份简历,硕士占比超70%!中欧基金如何破圈打造雇主品牌?

成立于2006年的中欧基金&#xff0c;作为国内首批实现员工持股的基金公司&#xff0c;坚持以人为本&#xff0c;相信优秀的业绩要靠优秀的人才来创造。 因此&#xff0c;中欧基金在完善公司治理机制基础上&#xff0c;实现不仅有敢打硬仗能打胜仗的将才&#xff0c;还有更多不…

Pytorch损失函数

基本用法 criterion LossCriterion() #构造函数有自己的参数loss criterion(x, y) #调用标准时也有参数 1 L1范数损失 L1Loss 计算 output 和 target 之差的绝对值。 torch.nn.L1Loss(reductionmean)参数&#xff1a; reduction-三个值 none: 不使用约简&#xff1b; me…

S32K系列MCU学习介绍

前言 最近因为工作需要&#xff0c;在学习恩智浦的S32K312&#xff0c;开发一款汽车PDU。 一、S32K3系列 1.特点 S32K系列是恩智浦公司于2017年推出的面向汽车电子的微控制器。S32K3 系列包括基于 Arm Cortex-M7 的 MCU&#xff0c;采用单步、双步和锁步内核配置&#xff0…

滴水逆向3期笔记与作业——01汇编

防止OneNote丢失。 海哥牛逼。 01汇编笔记 01进制进制定义10-2进制转换八进制 02数据宽度/逻辑运算数据宽度与存储逻辑运算计算机做加法的本质作业 03通用寄存器_内存读写通用寄存器表通用寄存器图内存读写计算机操作系统位数意义 04内存地址_堆栈寻址公式PUSH指令POP指令作业 …

《稻》念袁老,孙溟㠭先生为纪念袁隆平老先生治印一方

孙溟㠭篆刻作品《稻》 孙溟㠭篆刻作品《稻》 稻穗熟了&#xff0c;袁老走了。溟㠭先生为纪念袁隆平老先生而治印一枚。 拓印左侧禾苗繁茂&#xff0c;稻田里蛙声一片。拓印右侧为袁老的样子&#xff0c;人瘦心厚&#xff0c;顶着烈日&#xff0c;照料自己试验的稻田。袁老一…

3.黑马springboot开发篇自己修改笔记

SpringBoot开发实用篇 ​ KF-1.热部署 ​ 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄的把更新后的程序给重新加载一遍&#xff0c;这就是热部署。 ​ 热部署的功能…

[渗透教程]-017-入侵检测与社交网络安全

文章目录 1.入侵检测1.1 入侵检测基本概念1.2 入侵艰难侧系统评估指标1.3 入侵检测基本技术1.4 通用入侵检测框架2.社交网络安全1.入侵检测 1.1 入侵检测基本概念 入侵检测(Intrusion Detection),指对系统的运行状态进行监视,发现各种攻击企图、攻击行为或者攻击结果,以保证…

大神们分享STM32的学习方法

单片机用处这么广&#xff0c;尤其是STM32生态这么火&#xff01;如何快速上手学习呢&#xff1f; 第一&#xff1a;你要考虑的是&#xff0c;要用STM32实现什么 为什么使用STM32而不是8051? 是因为51的频率太低&#xff0c;无法满足计算需求?是51的管脚太少&#xff0c;无法…

MySQL单表操作

二、数据的新增、修改、删除 1.回顾ishop的数据表 mysql> use ishop; Database changed mysql> show tables; ----------------- | Tables_in_ishop | ----------------- | commodity | | commoditytype | | customer | | order | ----------…

【人工智能】遗传算法

人工智能算法---遗传算法&#xff08;基础篇&#xff09; 知识导图&#xff1a;遗传算法&#xff08;概念&#xff09;1.初始化种群二进制编码与解码 2.选择操作3.交叉操作4.评估操作5.终止操作 知识导图&#xff1a; 遗传算法&#xff08;概念&#xff09; 可以把遗传算法类比…

关于API接口应用

随着互联网技术的发展&#xff0c;API接口已成为众多应用程序开发中的必备工具&#xff0c;它不仅方便了开发者进行应用程序开发&#xff0c;也为应用程序提供了更多的功能和服务。本文将介绍API接口的概念和应用&#xff0c;以及API接口的优势和未来趋势。 一、什么是API接口…

Android 系统架构大图

android的系统架构和其操作系统一样&#xff0c;采用了分层的架构。从架构图看&#xff0c;android分为四个层&#xff0c;从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。 1.应用程序 Android会同一系列核心应用程序包一起发布&#xff0c;该应用…

Kubernetes快速部署

2 Kubernetes快速部署 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署&#xff1a; # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和…