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

news2024/11/14 7:44:46

平衡二叉树

  • 平衡二叉树又被称为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(千万条数据)
 

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

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

相关文章

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中,遇到需要在线预览各种文件的需求,最近遇到在线预览excel文件的需求,在此记录一下!本文主要功能实现,用于插件 LuckyExcel ,Luckysheet!废话不多说,上代码&#xf…

关于我的编程语言——C/C++——第七篇(深入4)

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过) 什么是文件&#xf…

【深度学习遥感分割|论文解读7】UNetFormer:一种类UNet的Transformer,用于高效的遥感城市场景图像语义分割

【深度学习遥感分割|论文解读7】UNetFormer:一种类UNet的Transformer,用于高效的遥感城市场景图像语义分割 【深度学习遥感分割|论文解读7】UNetFormer:一种类UNet的Transformer,用于高效的遥感城市场景图像语义分割 文章目录 【…

wget命令之Tomcat(三)

引言 Tomcat是一个开源的Java Web应用服务器,实现了多个关键的Java EE规范,包括Servlet、JSP(JavaServer Pages)、JavaWebSocket等。由于Tomcat技术先进、性能稳定且免费,它成为了许多企业和开发者的首选Web应用服务器…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据,不想手动执行,想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…

CISCO产品介绍

思科防火墙是由全球领先的网络解决方案提供商思科(Cisco)公司研发和生产的一系列网络安全设备。 思科的产品和服务涵盖了多个领域,包括但不限于: 网络硬件:思科的路由器和交换机是其核心产品,广泛应用于企…

机器学习(一)——基本概念、模型的评估与选择

目录 1 关于2 概念2.1 基础概念2.2 学习过程2.3 预测与评估2.4 标记与分类2.4.1 标记2.4.2 分类 2.5 回归分析2.6 聚类分析2.7 学习类型2.8 泛化能力2.9 统计学概念 3 模型评估与选择3.1 经验误差与过拟合3.2 评估方法3.2.1 留出法3.2.2 交叉验证法3.2.3 自助法3.2.4 调参与最终…

第三十五章 Vue路由进阶之声明式导航(跳转传参)

目录 一、引言 二、查询参数传参 2.1. 使用方式 2.2. 完整代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. Search.vue 2.2.4. Home.vue 2.2.5. index.js 三、动态路由传参 3.1. 使用方式 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Search.vue 3.2.4. Hom…

通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析

在 PyTorch 框架中,有一个看似简单的设置可以对模型性能产生重大影响: pin_memory。这个设置具体起到了什么作用,为什么需要关注它呢?如果你正在处理大规模数据集、实时推理或复杂的多 GPU 训练任务,将 pin_memory设为 True可以提高 CPU 与 GPU 之间的数据传输速度,有可能节…

博达S3956交换机批量配置接口导致设备重启

文章目录 现象厂家查看信息如下解决方法 现象 设备信息 交换机型号:博达S3956版本:2.2.0F Build 101150ROM版本:0.1.8 配置命令 interface range GigaEthernet0/1-40switchport pvid 10设备重启,配置未生效(批量配置…

【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本

文章目录 一、Ansible安装及远程控制1、关闭防火墙和SELinux2、安装ansible3、配置SSH无密码登录1、在管理机上生成一对密钥2、将公钥下发到远程主机3、保管密钥 4、主机目录 二、常用模块1、setup模块2、copy模块3、file模块4、shell模块5、script模块6、ping模块7、group模块…

Mysql学习笔记(一):Mysql的架构

一、mysql的组成部分 下面是来自Mysql实战的图片,该图片很好的表示了mysql的组成 mysql架构图 我们主要是和server层打交道,该层由连接器,分析器,优化器执行器、(查询缓存)组成 二、连接器的作用 每个客户端…

题目:Wangzyy的卡牌游戏

登录 - XYOJ 思路: 使用动态规划,设dp[n]表示当前数字之和模三等于0的组合数。 状态转移方程:因为是模三,所以和的可能就只有0、1、2。等号右边的f和dp都表示当前一轮模三等于k的组合数。以第一行为例:等号右边表示 j转…

【实验10】卷积神经网络(1)卷积算子

目录​​​​​​​ 1 自定义二维卷积算子 2 自定义带步长和零填充的二维卷积算子 3 实现图像边缘检测 4 自定义卷积层算子和汇聚层算子 4.1卷积层: 4.2 汇聚层: 5 学习torch.nn.Conv2d()、torch.nn.MaxPool2d();torch.nn.avg_pool2d()&…

基于springboot信用分析管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

用JavaScript、Nodejs写一个本地tcp服务,用于前端WebSocket调试

效果: 准备工作: 新建一个文件夹,在根目录安装依赖: npm install ws express 依赖介绍: WS是一个轻量级、高效的WebSocket库,适用于Node.js环境。 express 是一个流行的Node.js Web应用程序框架。 新…

golang分布式缓存项目 Day 1

注:该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 LRU缓存淘汰策略 三种缓存淘汰策略 FIFO(First In, First Out)先进先出 原理&…

论文阅读笔记:Depth Pro: Sharp Monocular Metric Depth in Less Than a Second

论文阅读笔记:Depth Pro: Sharp Monocular Metric Depth in Less Than a Second 1 背景1.1 动机1.2 提出的方法 2 创新点3 方法4 模块4.1 训练目标4.2 课程训练 4.3 边缘评价指标4.4 焦距估计 5 效果5.1 和SOTA方法的对比 论文:https://arxiv.org/abs/24…

Python练习13

Python日常练习 题目: 请编写fun函数,其功能是打印杨辉三角形。杨辉三角行如图所示: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 要求: 采用列表函数完成 -----------------------------------…

第18篇 :深入剖析systemverilog中 randomize 失败案例启示录(一)

经过前面章节的理论学习,我们对systemverilog中的随机约束,有一定的了解,那么,今天开始,着重讲述一些工作中遇到的困惑。主要通过一些例子,层层递进,举一反三,源于实践,剖…