【MySQL】MySql的底层数据结构

news2024/12/24 9:12:52

文章目录

  • 前言
    • 索引结构及查找算法
    • 不适合做MySql的数据结构及其原因
  • 一、BTree和B+Tree的引出
    • 1.1 BTree数据结构
    • 2.2 B+Tree数据结构
  • 二、计算m阶,即B+Tree该取多少合适
  • 总结

前言

索引结构及查找算法

一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢?其中就涉及到数据库(存储数据)以及查找算法。先来看一下几种查找算法;

  • 目录查找:类似索引
  • 遍历:暴力查找
  • 二分:B+树的基础算法
  • 键查找:hash查找

能做索引的数据结构有:数组、链表、红黑树、B树(B-树、B+树)。

那么哪种数据结构适合做 MySql 数据库的存储结构呢?

先来说下数据的一般存储方式:内存(适合小数据量)、磁盘(大数据量)。

磁盘的运转方式:速度 + 旋转,磁盘页的概念:每一页大概16KB。

不适合做MySql的数据结构及其原因

数组和链表的缺点就是数据量大的时候存不了,也就是说不合适大数据量。

哈希是通过hash函数计算出一个hash值的,存在哈希碰撞的情况,另外哈希也不支持部分索引查询以及范围查找。但是哈希的优点就是查找的时间复杂度是O(1),那么什么情况下可以使用hash索引呢?就是查询条件不会变,而且没有部分查询和范围查询的时候。

红黑树存储的数据量大的时候,红黑树的节点层数多,也就是树的高度比较高,查找的底层数据时,查找次数就比较多,即对磁盘IO使用比较频繁。总结为以下两点:

  1. 读取浪费太多:通过计算本来树的每一层大概需要分配16KB的数据,但是对于红黑树来说,实际存的节点数比较少,即存的数据大小远远小于16KB,从而造成存储空间的浪费
  2. 读取磁盘的次数过多:树的层数越多,查找数据时读取磁盘的次数也就越多

如下图所示,如果需要查找数字4的话,需要查找三次,即对磁盘IO操作三次:
在这里插入图片描述

我们想下,那为什么红黑树又可以在hashMap的查找那里用呢?
这就涉及到磁盘和内存的区别了,这里就不展开解释了,只需要知道是因为hashMap使用到是内存就可以了。

一、BTree和B+Tree的引出

针对红黑树以上总结的两点(不适合用来做mysql的数据结构的原因),有什么可以改进的方法呢?我们可以从以下两点出发:

  1. 增加树每层的节点数量,这样可以对分配的16KB充分利用,即解决上面的读取浪费的问题
  2. 尽可能的让树的高度减小,使得树显得比较“矮胖”,这样可以减少读取磁盘的次数

那么怎么样才可以实现以上的方法呢?这就需要用到B+树了,实际上MySql的底层数据结构就是用的B+树。

1.1 BTree数据结构

N阶的BTree的几个重要特性:

  1. 节点最多含有N颗子树(指针),N-1个关键字(数据存储空间) (N>=2);
  2. 除了根节点和叶子节点外,其它每个节点至少有M=N/2个子节点,M向上取整,即分裂的时候从中间分开,分成M棵子树;
  3. 若根节点不是叶子结点,则至少有两颗子树。

什么意思呢,我们来看下面这颗三阶的B树,结构大概长这样:
在这里插入图片描述

BTree有一个非常重要的操作,当一颗树不满足以上的性质的时候,会进行怎样的操作?红黑色大家已经知道了会进行变换颜色、左旋或右旋操作。而BTree会进行分裂操作。

先来看个例子:

创建一棵5阶的BTree,插入的数据有:2,13,6,1,7,4,10,12,5,16,22。
根据BTree的特性,5阶则在磁盘的页中最多有5个指针(存储查找路径的地址)、4个存储空间(存储关键字,即需要存的数据),那么具体的插入数据如下所示:
在这里插入图片描述

当插入7的时候,发现空间不足,此时就会出现分裂操作,从中间节点分开,把中间节点移到根节点,如下:
在这里插入图片描述
当插入16的时候,比6大,应该插入到右子树13的右边的,但是发现的空间不够,此时又会进行分裂操作,从右子树的中间节点(12)分开,把中间节点移到根节点,然后分裂成左右子树,这时一共有三颗子树了,如下所示:

在这里插入图片描述

最后插入22得到的一颗完整的树如下:
在这里插入图片描述

大家也可以添加多其它数据,然后看看分裂后的效果,这里就不一一列举了。

需要注意的是:分裂后的树节点仍要满足BTree的特性,其实也是满足二叉查找树(二叉排序树)的特点。

可以看到左子树的值比6小,中间节点的值(7、10)介于6和12之间,右子树的值均比12大。总的来说就是从左到右是有序的。

以上操作是BTree构建的详细过程,需要注意的是在构建过程中进行分裂的操作,分裂后必须关注的是是否仍满足了BTree的特性,是否是一颗二叉排序树。有时候插入一个数时,可能会经过多次分裂操作。

回过头来看上面提到的两个问题:

  1. 读取浪费太多;
  2. 磁盘读取次数过多。
    根据BTree的特点,我们可以看到BTree的查找效率还是挺高的,也能够解决这两个问题。

但是MySql还是没有选择使用BTree数据结构,这是为什么呢?主要原因有以下这几点:

  • 因为BTree不适合范围查找。就拿上面的来举例,比如我要查找小于6的数据,则先找到6的节点,然后需要遍历一遍6节点(索引)的左子树,不遍历的话,就拿不到小于6的这些数据了,也就说索引失效了,所以说不适合范围查找。
  • BTree的节点除了存储索引之外,还存储了数据本身,占用空间较大,但是磁盘的页大小是有限的(16KB左右),因此,存储同样大小的数据,BTree显得比较高(相对B+Tree),稳定性弱一些。

综上两个主要原因,MySql最终选择了B+Tree的数据结构来存储数据。

2.2 B+Tree数据结构

B+Tree和BTree的分裂过程类似,只是B+Tree的非叶子节点不会存储数据,只存储索引值(指针地址),所有的数据都是存储在叶子节点,其目的是为了增加系统的稳定性。这里就不再列举B+Tree的分裂过程了,我们直接看下B+Tree到底长啥样,如下图所示:
在这里插入图片描述

实际上MySql的底层数据结构B+Tree是长这样的,如下图所示:
在这里插入图片描述

大家可以看出B+Tree与BTree有啥不一样呢?由上图可以看出B+Tree有以下几个特点:

  1. 叶子节点连起来了,是一条有序的双向链表,目的是为了解决范围查找。比如需要查找小于9的数据,只要找到等于9的数据,然后将9的左边数据全部拿出来即可。
  2. 非叶子节点不存数据,只存索引,空间利用更高效。
  3. 数据的个数和节点一样多,换句话说,非叶子节点存的是其子树的最大或最小值。

对于索引失效的情况,BTree是需要遍历整棵树才能把所有数据拿到,而B+Tree只需要找到叶子节点的第一个节点即可把所有数据拿到,可见效率是B+Tree更优,这就是双向链表的妙用。

二、计算m阶,即B+Tree该取多少合适

m是怎么计算出来的呢?是根据磁盘的页大小来计算的,也就是说是由磁盘页大小决定的。

我们知道,磁盘的页大小大概是16K,MySql创建索引时,可以根据字段及类型来计算磁盘一页大概可以存多少数据。

根据官方文档描述,树高度等于2时(2阶),大概可以存两万多条数据;高度等于3时(3阶),大概可以存两千多万条数据,怎么计算的呢?

首先,1 千字节(KB)=1024 字节(B),一页有16KB,假设存主键+指针大概有8+6=14B,则一页就可以存:16*1024/(8+6)=1170 个索引了。

对于3阶的B+Tree来说,大概可以存:1170^3 条数据,大概是两千万。

总结

BTree是B+Tree的一个过渡,B+Tree适合用于大数据量的磁盘索引数,经典的就是上面讲到的作为MySql的底层索引结构,所有的数据都存在叶子节点,其它节点只存储索引,增加了系统的稳定性、提高查找效率以及查询时减少磁盘的IO操作。

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

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

相关文章

如何在Linux系统中使用SCP命令传输文件和文件夹?

在Linux系统中,SCP(Secure Copy)是一种用于在本地和远程主机之间安全传输文件和文件夹的命令行工具。它基于SSH协议,并提供了加密和身份验证机制,确保数据的安全性和完整性。 本文将详细介绍如何使用SCP命令在Linux系统…

如何通过pytest进行更改自动化测试用例的执行顺序?

前言 在自动化测试中,自动化测试用例设计原则就是执行过程时不能存在依赖顺序,那么如果测试用例需要按照指定顺序执行,这个时候应该怎么做呢?目前单元测试框架中unittest没有办法改变测试用例的执行顺序,但是另一个单…

北京发布Web3.0白皮书!币圈扬言:国际金融格局即将重塑!

如今,虚拟资产已成为香港数字经济与金融创新的“桥头堡”。随着加密新政生效在即,市场暗流涌动,头部交易所争相布局,香港或将迎来新一轮的加密竞争。 多家交易所进军香港 5月28日,欧易(OKX)完成…

浅谈兼容性测试点和注意项

一:兼容性测试的概念:就是验证开发出来的程序在特定的运行环境中与特定的软件、硬件或数据相组合是否能正常运行、有无异常的测试过程。 二:兼容性测试的分类: (1)浏览器兼容性测试 指的是在浏览器上检…

one-stage目标检测方法

YOLO系列算法 从区域推荐到端到端 RCNN系列的方法和核心思想在于:先找出可能存在物体的区域,再确认物体的存在 这种思路归根溯源,来自传统的目标检测算法。 为了解决传统方法中的滑动窗口的方式,来找出可能存在目标的区域&…

自学软件测试到什么程度才可以去找工作...拿到阿里offer后才知道有这些就够了!!

如果是纯自学,建议先自学软件测试基础、功能测试等,然后找一个相关的工作,在工作中,边增长项目经验,边自学更难一点的自动化编程、性能测试等。自动化测试、性能测试如果没有老师带,自学的难度比较大&#…

uniapp 使用自定义icon图标

1.下载图标文件 阿里图标库位置:iconfont-阿里巴巴矢量图标库 eg: 搜索 “书签” 图标,点击加入购物车,再进入购物车,填写加入项目,也可以直接下载,点击编辑 编辑可以设置图片颜色,或像素大小…

immutable深拷贝:数据多层属性-不可变数据结构

一、为何要用immutable深拷贝? 1.浅拷贝(浅复制) //引用赋值-浅复制、浅拷贝 var obj{name:"溜溜球"}var obj2obj;obj2.name"刘刘球";console.log(obj);//name:"刘刘球"console.log(obj2);//name:"刘刘…

[C++][opencv]opencv填充透明色到不规则polygon区域

大家用yolov5-seg分割都知道官方演示分割结果会把分割区域半透明填充到原图里面,那么C如何实现呢。今天特地研究了下。由于分割点是变动的,所以我们需要用变量控制分割点数。 参考文章写的很不错,但是有个毛病,他这个是5点必须是…

MySQL---JDBC基础操作、SQL注入

1. JDBC JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java 语言编写的接口和类组成。 JDBC需要连接…

unreal 5.1 增强输入实现

在ue5.1版本增加了增强输入,并且废弃了之前的轴映射和操作映射。 官方文档地址:https://docs.unrealengine.com/5.1/zh-CN/enhanced-input-in-unreal-engine/ 输入动作(Input Actions) 更改后的区别我体验下来,它将…

探索 PlanetIX:解读区块链游戏运营的奥秘

作者: danielfootprint.network 熊市之中,PlanetIX 成长为最强的 Web3 游戏,在 Polygon 网络上独占鳌头。而其开发团队深度使用了 Footprint Analtics 的零代码数据分析平台和-GameFi 的数据 API 来提升用户的游戏体验。 近日,Footprint 与…

Visual Studio添加native tools command prompt

学习UEFI开发,环境设置种需要用到native tools command prompt,但是看了一下VS2017的Tools菜单下没有这个选项。网上查询,解决了问题: Tools > External Tools > Add Title:VS Command PromptCommand:C:\Windows\System32\…

操作系统原理 —— 内存管理的概念(十八)

为什么要有内存管理 为什么要对内存进行管理,需要解决什么问题? 要回答这个问题,首先我们需要明白:进程运行时,需放在内存才能运行。比如在执行一个程序时,需将该程序的相关数据与指令装入内存才能运行。…

家居购项目 (上)

文章目录 🐀Java后端经典三层架构🐇MVC模型🐇开发环境搭建🐇会员注册🌳前端验证用户注册信息🌳思路分析🍉创建表🍉创建实体类🍉DAO🍌MemberDAOImpl &#x1f…

ISO21434 组织网络安全管理

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 4.1 网络安全治理 4.2 网络安全文化 4.3 信息共享 4.4 管理系统 4.5 工具管理 4.6 信息安全管理 4.7 组织网络安全审计 五、输出 一、概述 为了实现网络安全工程,该…

Rotary Position Embedding (RoPE, 旋转式位置编码) | 原理讲解+torch代码实现

🔥 RoPE为苏剑林大佬之作,最早应用于他自研的RoFormer (Rotary Transformer),属于相对位置编码。效果优于绝对位置编码和经典式相对位置编码。出自论文:《RoFormer: Enhanced Transformer with Rotary Position Embedding》 &…

轻松高效!三种方法教你音频转文字!

我们在日常生活中,总会遇到许多需要音频转文字的情况。这个时候大部分小伙伴会选择一边播放音频一边记录的方式来整理音频的内容,这样既麻烦又费时,整理的效率也不高。其实我们只需要使用软件来协助我们将音频转换成文字,就可以很…

2023年03月六级真题全3套【可复制可划线查词】共11页PDF

2023年03月六级真题全3套【可复制可划线查词】共11页PDF 2023年03月六级真题全3套【可复制可划线查词】共11页PDF 2023年03月六级真题全3套【可复制可划线查词】共11页PDF

html基础知识总结

(一)html 1、html html:超文本标签语言,专门用来制作网页的一门语言。超文本:就是它不仅可以放文本内容,还可以是图片,声音,视频,多媒体等等内容 2、 html标签的分类 …