页分裂和页合并——Java全栈知识(33)

news2024/11/27 8:38:05

上篇文章我们讲到了 MySQL 的数据页,我们说到了 InnoDB 的索引是以 B+树的形式构建的,而且 B+树的节点都是一个数据页。
但是 B+树在使用过程中难免会有节点分裂和节点合并的过程。
因为我们是以数据页为基本单位构造的 B+树,那么 B+树的节点分裂和节点合并就会造成数据页的页分裂和页合并。

我们都是知道,B+树是按照索引字段建立的,并且在 B+树中是有序的,假如有下面一个索引的树结构,其中的索引字段的值并不连续。
image.png

1、页分裂

假如,现在我们插入一个新的一条记录,他的索引值是 3,那么他就要按照顺序插入到页 20 中,在索引值为 1,2 的记录的后面。而如果这个索引页已经满了,那么就需要触发一次页分裂。

页分裂是指将该页面中的一部分索引记录移动到一个新的页面中,从而为新记录腾出空间。这样可以保持 B+树的平衡和性能。

以下,就是一次页分裂的过程:
image.png

当我们插入一组无序的数据的时候,那么就可能导致多次的页分裂的情况。
而且某些情况下,可能会从叶子节点一路分裂到根节点(B+树的非叶子节点也存储数据,也可能分裂)。

2、页合并

既然会有页分裂那么就会有页合并。
页分裂发生在 insert 阶段,那么页合并就是发生在 delete 阶段。
当我们删除索引下的数据的时候,叶子节点的数据就会变得比较稀疏,此时 B+树就会触发合并操作。
image.png

3、页分裂和页合并的影响

首先,页分裂和合并是涉及大量数据移动和重组的操作。频繁进行这些操作会增加数据库的/O 负担和 CPU 消耗,影响数据库的整体性能。

第二,分裂和合并可能导致 B+树索引结构频繁调整,这个过程也会影响插入及删除操作的性能。

第三,频繁的页分裂和合并可能会导致磁盘上存在较多的空间碎片,新分出的一个页一般会有很多空闲空间,使得数据库表占用更多的磁盘空间,而导致浪费。

因为一个数据页是 16KB,如果此时的叶子节点存储两条数据也是需要 16KB,剩余的位置填充对齐。存储五条数据的时候也是 16KB。所以空间碎片会导致磁盘空间的浪费。

4、避免页分裂

1、我们在设置主键的时候尽量选择能够自增的字段
2、不要使用 varchar 类型作为 ID 主键。
3、我们在生成全局唯一 ID 的时候尽量不要使用 UUID,UUID 不是自增的。

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

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

相关文章

django —— 搭建项目及简单测试

打开Pycharm编辑器 新建项目 File -> New Project 创建应用管理 -> myapp 打开终端输入 python38 manage.py startapp myapp 执行后会在项目下自动生成myapp文佳夹 把myapp配置到settings.py中 在settings.py文佳INSTALLED_APPS 中输入 在views.py中编写业务接口 把…

云计算:重塑数字时代的基石

目录 一、引言 二、云计算的定义与特点 三、云计算的发展历程 四、云计算的应用场景 五、云计算面临的挑战 六、云计算的未来发展趋势 七、结语 一、引言 随着信息技术的飞速发展,云计算已经逐渐渗透到我们生活的方方面面。从个人用户的在线存储、在线办公&…

昇思25天学习打卡营第5天|数据变换 Transforms

昇思25天学习打卡营第5天|数据变换Transforms 前言数据变换 TransformsCommon TransformsCompose Vision TransformsRescaleNormalizeHWC2CHW Text TransformsPythonTokenizerLookup Lambda Transforms 个人任务打卡(读者请忽略)个人理解与总结 前言 非常…

树莓派4B学习笔记14:Python多线程编程_线程间的同步通信_(锁‘threading.Lock’)

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习树莓派与Python的多进程编程_线程间同步通信 文…

capitalize()方法——字符串首字母转换为大写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 capitalize()方法用于将字符串的首字母转换为大写,其他字母为小写,例如图1所示的效果。 图1 字符串首字母大写效果…

安全技术和防火墙(2)

安全技术和防火墙 文章目录 安全技术和防火墙安全技术防火墙通信的五大要素和四大要素四表五链*控制类型管理选项:匹配条件实验步骤关闭防火墙 添加规则指定IP地址指定多个ip指定端口拒绝访问nginx删除规则修改策略修改链拒绝整个网段禁止多个端口匹配mac地址 iptab…

代理IP对SEO影响分析:提升网站排名的关键策略

你是否曾经为网站排名难以提升而苦恼?代理服务器或许就是你忽略的关键因素。在竞争激烈的互联网环境中,了解代理服务器对SEO的影响,有助于你采取更有效的策略,提高网站的搜索引擎排名。本文将为你详细分析代理服务器在SEO优化中的…

自动化代码规范检查--Sonarqube部署

参考文档 官方文档安装数据库 官方给出几种数据库: # 我们选用postgres, 拉取镜像 docker pull postgres:16.0# 创建存储卷 docker volume create postgresql-data# 运行容器 docker run -d --name sonarqube-postgres \-p 5432:5432 \-e POSTGRES_DB=sonar_DB \-e POSTGRE…

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # coding=UTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到的帧数保存json文件 time: 2024-6-27 author: cong…

vs2017调试MFC源码与dll版本不匹配

如上图,使用VS2017调试MFC源码,提示源码与dll不匹配。 经过一番折腾终于找到了原因:同时安装了vs2017、vs2022,结果加载的mfc140ud.dll不是vs2017的,而是vs2022的,主版本号虽然都是14,但小版本…

uniapp加载打点点效果

uniapp加载打点点效果 背景实现思路代码实现尾巴 背景 为了增加系统的交互性,我们在加载数据时通常会增加一些loading动效,但是在某些场景下只需要一些简单文字提醒。比如说使用【加载中】或者【loading】等字段,但是写静态的字符又显得交互…

探索未来的AI革命:GPT-5的即将登场

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

-bash: /snap/bin/docker: 没有那个文件或目录

-bash: /snap/bin/docker: 没有那个文件或目录 解决办法 export PATH$PATH:/usr/bin/docker然后,重新加载配置文件 source ~/.bashrc

43.SO_BACKLOG

属于ServerSocketChannel参数 SO_BACKLOG 设置的过小,高峰期有很多连接来了,就会被拒绝,报拒绝连接错误。 控制全连接队列的大小,可以容下适量连接。所以SO_BACKLOG设置的要大一些。 serverBootstrap.option(ChannelOption.SO_B…

AI 卖货主播大模型:Streamer-Sales 销冠!MoneyPrinterTurbo :简直就是营销号的梦想工具!

AI 卖货主播大模型:Streamer-Sales 销冠!MoneyPrinterTurbo :简直就是营销号的梦想工具! AI 卖货主播大模型:Streamer-Sales 销冠! 项目简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购…

EXCEL返回未使用数组元素(未使用值)

功能简介: 在我们工作中,需要在EXCEL表列出哪些元素(物品或订单)已经被使用了(或使用了多少次),哪些没有被使用。 当数量过于庞大时人工筛选或许不是好办法,我们可以借助公式&…

encode()方法——编码字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 编码是将文本(字符串)转换成字节流,Unicode格式转换成其他编码格式。在Python中提供了encode()方法&am…

数据库对比脚本,java如何对比两个数据库的表字段的不同

因为有时候开发环境和 测试环境,有时候会有不同的数据库表,比如有些加字段了,所以这个脚本就实现了对比两个数据库连接的数据库到底哪里不一样,输出到控制台 package com.junfun.pms;import lombok.extern.slf4j.Slf4j;import ja…

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏: 1、制造一面砖块组成的墙 在关卡中放置一个cube,放这地面上,将其转换成蓝图类,改名BP_Cube,更换砖块的贴图,按住alt键进行拷贝,堆出一面墙,复制出来的会很多,全选移动…

【深度学习】卷积神经网络CNN

李宏毅深度学习笔记 图像分类 图像可以描述为三维张量(张量可以想成维度大于 2 的矩阵)。一张图像是一个三维的张量,其中一维代表图像的宽,另外一维代表图像的高,还有一维代表图像的通道(channel&#xff…