MySql中索引为什么用B+树,他有什么特点?时间复杂度是多少?能存多少数据?是不是只能三层?他与B-树有什么不同?还有其它的树你是是否知道?

平衡二叉树

  • 平衡二叉树又被称为AVL树
  • 平衡二叉树是一颗空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右子树也是平衡树
  • 非叶子节点值大于左子节点值而小于右子节点值
  • 非叶子节点最多拥有两个子节点
  • 平衡二叉树的不足之处及时间复杂度

  • 如果每次插入的数据都比上一次插入的数据大,那么用平衡二叉树就会以线性方式进行存储,所以他的时间复杂度为O(n)。在mysql中一张表存储百万条数据是很正常的一件事,这样会导致树的深度更深,导致大量的IO操作。还有就是mysql进行过磁盘读取时,是以页为单位进行读取,每个节点表示一页。而平衡二叉树每个节点存储一个关键词,导致存储空间被浪费。
  • 红黑树

  • 每个节点要么是红色要么是黑色
  • 根节点是黑色
  • 每个叶子节点(NIL)是黑色
  • 每个红色节点的两个子节点一定为黑色
  • 任意一个节点到每个叶子节点的路径都包含数量相同的黑色节点
  • 如果一个节点存在黑子节点,那么该节点肯定有两个子节点
  • B-树

     B-树(B树)并不只能有三层。B树的高度取决于其阶数(即每个节点最多可以拥有的子节点数)以及树中存储的元素数量。
  • 每个节点中,都包含数据(key和data域)和指针,相互间隔
  • 叶节点具有相同的深度,叶节点的指针为空
  • 节点中的数据索引从左到右递增排列
  • 所有索引元素不重复
  • B-树相比平衡二叉树优点

  • 每个节点存储多个多个关键词,合理利用空间大小,每次mysql进行读取时,都会进行预读取,每次把该节点数据读取出来并存储到内存中
  • B-树中每个节点存储的关键词变多,导致存储相同数量的数据,B-树的深度相比平衡二叉树深度更浅,减少了数据的查找次数和复杂度
  • B+树

    B+树同样也不只能有三层,从罕见角度来说他也可以一层,二层,但是很罕见
  • 非叶子节点中不存储data,只存储索引,可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点包含数据(key和data域)和指针
  • 叶子节点用指针连接,提高区间访问的性能
  • B+树对比红黑树

  • 红黑树多用于内部排序,即全放在内存中
  • B+树多用于外存上时,B+也被成为一个磁盘友好的数据结构
  • 红黑树和平衡二叉树有相同缺点,每个节点存储一个关键词,数据量大时,导致红黑树的深度很深,mysql每次读取时消耗大量io

B+树通常设计为三层的原因主要包括以下几点‌:


一个高度为3的B+树大概可以存放:1170*1170*16=21902400行数据。
所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。
在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次逻辑IO操作即可查找到数据。
‌性能优化‌:三层B+树可以在保证性能的同时,减少对磁盘的I/O操作。例如,一个三层B+树在查找数据时,最多只需要三次I/O操作,这大大提高了数据查找的效率‌1。
‌存储效率‌:三层B+树可以存储大量的数据。假设每个节点存储16KB的数据,一个三层B+树可以存储大约2000万条数据,这足以满足大多数应用场景的需求‌2。
‌平衡性‌:B+树的插入和删除操作会保持树的平衡,三层结构可以确保树的深度适中,避免过深的树结构导致的性能下降‌2。
‌维护成本‌:三层结构相对简单,维护成本较低。过多的层数会增加树的复杂度,从而增加维护和管理的难度‌2。
‌实际应用场景‌:在实际应用中,三层B+树已经能够满足大多数数据库和文件系统的需求,不需要更深层次的树结构‌2。


B+树的时间复杂度是多少?


由于B+树所有的 data 域都在根节点,所以查询 key 的节点必须从根节点索引到叶节点,时间复杂度固定为 O(log n)。


B+树相比B-树的优点


B+树非叶子节点只存储key值,而B-树存储key值和data值,这样B+树每次读取时可以读取到更多的key值
mysql进行区间访问时,由于B+树叶子节点之间用指针相连,只需要遍历所有的叶子节点即可;而B-树则需要中序遍历那样遍历
B+树非叶子节点只存储key值,而B-树存储key值和data值,导致B+树的层级更少,查询效率更高
B+树所有关键词地址都存在叶子节点上所以每次查询次数都相同,比B-树稳定


为什么高度为3的B+树存储千万级数据?


解释这个问题的前提,mysql使用InnoDB引擎,mysql默认页文件大小为16k
假设我们一行数据大小为1k,那么一页存储16条数据,也就是说一个叶子节点能存储16条数据
再来看看非叶子节点,假设主键ID为bigint类型,那么长度为8B,指针大小在InnoDB引擎中的大小为6B,一共14B,那么一页中可以存放16k/14B=1170个(主键+指针)
也就是说高度为2的B+树可以存储的数据为:1170*16=18720条;高度为3的B+树可以存储的数据为:11701170*16=21902400(千万条数据)
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3DMAX城镇建筑区块生成插件TownBlocks使用方法详解

3DMAX城镇建筑区块生成插件TownBlocks使用教程 3DMAX城镇建筑区块生成插件TownBlocks,是一款专为城镇建筑区块生成设计的实用工具,它能够实现从2D轮廓到低多边形城镇建筑群的一键批量转换。该插件不仅操作简便,而且提供了丰富的参数设置选项&…

手机内卷下一站,AI Agent

作者 | 辰纹 来源 | 洞见新研社 2024年除夕夜,OPPO在央视春晚即将开始前举办了一场“史上最短发布会”,OPPO首席产品官刘作虎宣布,“OPPO正式进入AI手机时代”。 春节假期刚过,魅族又公开表示,将停止“传统智能手机…

A021基于Spring Boot的自习室管理和预约系统设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

浮点数二进制在线转换器

具体请前往:浮点数在线转二进制工具--在线将10进制浮点数(float)转化为4字节32位的二进制序列

探索 Python 的新边疆:sh 库的革命性功能

文章目录 **探索 Python 的新边疆:sh 库的革命性功能**第一部分:背景介绍第二部分:sh 库是什么?第三部分:如何安装 sh 库?第四部分:简单库函数使用方法1. 执行 ls 命令2. 使用 grep 搜索文件内容…

【GeoJSON在线编辑平台】(2)吸附+删除+挖孔+扩展

前言 在上一篇的基础上继续开发,补充上吸附功能、删除矢量、挖孔功能。 实现 1. 吸附 参考官方案例:Snap Interaction 2. 删除 通过 removeFeature 直接移除选中的要素。 3. 挖孔 首先是引入 Turf.js ,然后通过 mask 方法来实现挖孔的…

吾店云介绍 – 中国人的WordPress独立站和商城系统平台

经过多年在WordPress建站领域的摸索和探索,能轻松创建和管理各种类型网站的平台 – 吾店云建站平台诞生了。 应该说这是一个艰苦卓绝的过程,在中国创建一个能轻松创建和使用WordPress网站的平台并不容易,最主要是网络环境和托管软件的限制。…

【动手学电机驱动】STM32-FOC(6)基于 IHM03 的无感方波控制

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删

目录 1.双向链表 2.结构体的定义 3.示意图 3.代码示例 1.双向链表的尾插 示意图 代码 main.c List.h List.c 详细分析代码的执行过程 双向链表的初始化 2.双向链表的打印 代码 3.双向链表的尾删 1.双向链表 以一种典型的双向链表为例:带头双向循环链表(带头:带…

「QT」几何数据类 之 QPoint 整型点类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

黑马点评1 session实现短信验证码登录

1 什么是session cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录 session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息…

[Docker#3] LXC | 详解安装docker | docker的架构与生态

目录 1.LXC容器操作 安装LXC LXC容器操作步骤 2.理论 LXC 是什么? Docker 是什么 Docker 和虚拟机的区别 Docker 和 JVM 虚拟化的区别 Docker 版本 ⭕Docker 官方网站(建议收藏) Docker 架构 生活案例 Docker 生态 Docker 解决…

MySQL数据库专栏(五)连接MySQL数据库C API篇

摘要 本篇文章主要介绍通过C语言API接口链接MySQL数据库,各接口功能及使用方式,辅助类的封装及调用实例,可以直接移植到项目里面使用。 目录 1、环境配置 1.1、添加头文件 1.2、添加库目录 2、接口介绍 2.1、MySql初始化及数据清理 2.1.…

从0开始深度学习(27)——卷积神经网络(LeNet)

1 LeNet神经网络 LeNet是最早的卷积神经网络之一,由Yann LeCun等人在1990年代提出,并以其名字命名。最初,LeNet被设计用于手写数字识别,最著名的应用是在美国的邮政系统中识别手写邮政编码。LeNet架构的成功证明了卷积神经网络在…

如何用C#和Aspose.PDF实现PDF转Word工具

在本篇博文中,我将详细讲解如何用C#实现一个PDF转Word工具。这款工具基于Aspose.PDF库,实现PDF文件转为Word(DOC/DOCX)格式的功能,并通过用户友好的界面和状态提示提升用户体验。希望通过这篇文章帮助大家理解软件的实…

运维技术之文件系统(File System for 0peration and Maintenance Technology)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向,洞悉 IoTDB 与 HBase 的详尽对比! 在物联网(IoT)领域,数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长,开发者和决策者们需要选择…

【Vue】Vue2和Vue3响应式原理

前言 Vue 3 的核心部分可以分为三个主要模块:Compiler、Reactivity 和 Runtime。响应式的处理逻辑在 Reactivity 部分。 Compiler(编译器):Template > 渲染函数 将 Vue 的模板(Template)转换成 JavaS…

哪些人群适合考取 PostgreSQL 数据库 PGCM 证书?

#postgresql#,作为开源数据库领域的佼佼者,凭借其强大的功能和广泛的应用场景,吸引了大量数据库从业者的关注。它代表着持有者在PostgreSQL数据库管理、优化、安全和高可用性设计等方面的专家级技能。 PGCM证书适合那些具备扎实理论基础和一…

C++高级编程(9)

九、STL模板库 1.C函数模板 函数模板是一个独立于类型的函数,可产生函数特定类型的版本。通过对参数类型进行参数化,获取有相同形式的函数体。 它是一个通用函数,它可适应一定范围内的不同类型对象的操作。 函数模板将代表着不同类型的一组…