mysql底层是如何存放数据的
总览
首先总的来说,分为四个层级,行页区段。行就是数据库里的一行数据。
但一次从磁盘读进内存的数据量是一页(页是读写的单位,默认16KB一页),页分很多种类,例如数据页、溢出页、undo日志页。
而我们知道B+树的叶子节点是逻辑上连续的,假设物理上不连续,那随机io的开销还是很大的,所以把不同页整合到一起还是有必要的,这就是区,假设每个区1MB,那对16KB的页,最多连续64个页能存进连续的一段空间,加速了范围访问。
段分为数据段、索引段、回滚段。数据段就是叶子节点的所有区,索引段就是非叶子节点的所有区,回滚段存放的是回滚数据。

行数据

变长字段长度列表(若没有varchar,则该字段是不存在于行中的)
存储varchar类型的当前数据长度,例如下图

假设字符集时ascii(一个字符一个字节),则第一条记录,name占用一个字节,即0x01,phone占用三个字节,即0x03,在变长字段长度列表中,要按照倒序(千万要注意!不是按照字节大小,是按照列的顺序的倒叙即列n、列n-1…列1),如下图

同理,第二条第三条数据(NULL值不会被存到“记录的真实数据”,所以也不用在变长字段长度列表里存储)

那么为啥要倒着存储字段的长度呢?
答案是,为了尽可能一次读取数据时,让真实数据和长度被读进一个cache line里,提高命中率

NULL值列表(设定了NOT NULL则也不存在于行中)
分配整数个字节,然后一个字节可以表示8个列的是否为NULL的情况(不足8个也要分配一个字节,超过则两个字节),同样
对于第一条数据,没有NULL值,则全是0

第二条数据age是NULL

第三条数据age和phone是NULL

总体来看,目前状况是这样的:

记录头信息
- delete_mask,是1代表本行被删除,也就是说删除数据不是真删了,只是赋值了标志位罢了
- next_record,指向了下一条记录(指向位置是记录的额外信息和记录的真实数据中间,往左往右就可以访问二者,高效)
- record_type,表示当前行的类型,0代表普通记录、1代表非叶子节点、2代表最小记录、3代表最大记录
记录的真实数据
这是三个隐藏列,是MySQL自动为每个记录添加的
- row_id,假设建立表的时候没有主键或者唯一约束列,就会有这个隐藏列,否则就没有。占6字节
- trx_id,事务id,代表数据由哪些事务产生,是必须的。占6字节
- roll_pointer,记录上一个版本的指针,是必须的。占7字节
varchar(n)最大取值?
MySQL约束的一行记录最多65535(TEXT、BLOB这种大对象类型除外),这既包括额外信息,还包括真实数据,但不包括记录头信息和隐藏列。那来算一下把。
- 假设只有一个列,并且这个列是varchar。如果设定可以为NULL则要-1,否则不考虑NULL值列表。变长字段长度列表分两种情况:1、最大长度低于256( 2 8 2^8 28),则分配一字节记录2、大于256,则分配两字节( 2 1 6 = 65536 2^16=65536 216=65536)记录。很显然本例子是第二种情况,因此65535-1-2=65532字节。那么对于ascii的字符集,n=65532,utf8则是n=65532/3
- 假设两列,和上述一样,看下图

行溢出的处理
通常默认一个页16KB,16*1024=16384个字节,少于65532,造成了可能一个页都放不下一行
对于Compact行格式,会把溢出部分存到溢出页:

对于compressed、dynamic行格式,记录真实数据的地方只会存放指针了,数据全部存到溢出页

相关文章:
mysql底层是如何存放数据的
总览 首先总的来说,分为四个层级,行页区段。行就是数据库里的一行数据。 但一次从磁盘读进内存的数据量是一页(页是读写的单位,默认16KB一页),页分很多种类,例如数据页、溢出页、undo日志页。 …...
【代码随想录】刷题笔记Day33
前言 Day33虽说是一个月,但是从第一篇开始实际上已经过了8个月了,得抓紧啊 46. 全排列 - 力扣(LeetCode) 前面组合就强调过差别了,这道题是排序,因此每次要从头到尾扫,结合used数组 class So…...
AD从原理图到PCB超详细教程
AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…...
2023.11.20使用flask做一个简单图片浏览器
2023.11.20使用flask做一个简单图片浏览器 功能: (1)输入指定路径,打开文件夹 (2)判断文件格式为图片 (3)在前端进行预览 (4)使用bootstrap进行简单美化 ma…...
https和http的区别和优势
大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…...
Docker 启动alpine镜像中可执行程序文件遇到 not found
## 1. 问题: docker alpine镜像中遇到 sh: xxx: not found 例如: 在容器内/app/目录下放置了可执行文件abc,启动时提示not found /app/startup.sh: line 5: ./abc : not found ## 2. 原因 由于alpine镜像使用的是musl libc而不是gnu libc&am…...
.net对接阿里云CSB服务
public Response<string> Main(MonthPlanRequest request){string apiName "MonthPlan", postData request.ToJson(); var result ConnectCSB(apiName, postData);return InvokeResult.Fail<string>("访问成功");}/// <summary>///…...
Json数据格式
json比较可读,通过键值对返回。实现通常有两种方式:一种是自己来构造,也就是用一个对象存储数据,在最后输出时将其json字符串化;第二种是使用 RestController 注解实现json数据返回。 第一种 导入依赖坐标: <depe…...
Kafka-Producer
1、生产者 从编程的角度而言,生产者是一个消息的生产者,它负责创建消息并发送到Kafka集群中的一个或多个topic中。 1.1、客户端开发 一个正常的生产逻辑需要具备以下几个步骤: 配置生产者客户端参数及创建相应的生产者实例构建待发送的消…...
Ubuntu20上离线安装samba
如果联网,一条 sudo apt-get install samba就可能解决问题,但是没有网,那么只能一个一个的解决问题: 我以为装了samba-common就可以了,发现smbd.serverice not found,于是开始了漫长的下载依赖包,安装&…...
【开源】基于Vue.js的教学过程管理系统
项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…...
【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )
文章目录 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中1、分离代码 后的 友元函数报错信息 - 错误示例Student.h 头文件内容Student.cpp 代码文件内容Test.cpp 代码文件内容执行报错信息 2、问题分析 二、代码示例 - 函数实现 写在类外部的不…...
动手学深度学习——循环神经网络的简洁实现(代码详解)
文章目录 循环神经网络的简洁实现1. 定义模型2. 训练与预测 循环神经网络的简洁实现 # 使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, …...
19.删除链表的倒数第 N 个节点
题目来源: leetcode题目,网址:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 解题思路: 使用双指针找到倒数第 N1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时,倒数第 N1 …...
机器人制作开源方案 | 莲花灯
1. 功能描述 莲花灯是一款基于莲花形象设计的机器人,本文示例将用两种模式来实现莲花灯的亮灭功能。 自主模式:用 光强传感器 控制莲花灯的灯叶开合。暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭。 …...
华为无线ac+fit三层组网,每个ap发射不同的业务vlan
ap管理dhcp在ac控制器上,业务dhcp在汇聚上 配置WLAN业务 (1)配置VAP模板 • 配置员工网络的VAP模板(employee) [AC-wlan-view] security-profile name employee //创建名为“employee”的安全模板 [AC-wlan-sec-prof-…...
人工智能:科技之光,生活之美
在科技飞速发展的今天,人工智能已经深入到我们的生活中,它如同一束璀璨的科技之光,照亮我们生活的每一个角落,使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…...
mysql8.0英文OCP考试第61-70题
Q61.You wish to protect your MySQL database against SQL injection attacks. Which method would fail to do this? A)using stored procedures for any database access B)using PREPARED STATEMENTS C)installing and configuring the Connection Control plugin ( …...
WaveletPool:抗混叠在微小目标检测中的重要性
文章目录 摘要1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方法的选择及应用顺序4.4、小波的选择4.5、T…...
文章系列2:Unraveling the functional dark matter through global metagenomics
这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法,包括reads-based reference mapping(eg…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
