当前位置: 首页 > news >正文

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比较可读&#xff0c;通过键值对返回。实现通常有两种方式:一种是自己来构造&#xff0c;也就是用一个对象存储数据&#xff0c;在最后输出时将其json字符串化&#xff1b;第二种是使用 RestController 注解实现json数据返回。 第一种 导入依赖坐标&#xff1a; <depe…...

Kafka-Producer

1、生产者 从编程的角度而言&#xff0c;生产者是一个消息的生产者&#xff0c;它负责创建消息并发送到Kafka集群中的一个或多个topic中。 1.1、客户端开发 一个正常的生产逻辑需要具备以下几个步骤&#xff1a; 配置生产者客户端参数及创建相应的生产者实例构建待发送的消…...

Ubuntu20上离线安装samba

如果联网&#xff0c;一条 sudo apt-get install samba就可能解决问题&#xff0c;但是没有网&#xff0c;那么只能一个一个的解决问题&#xff1a; 我以为装了samba-common就可以了&#xff0c;发现smbd.serverice not found,于是开始了漫长的下载依赖包&#xff0c;安装&…...

【开源】基于Vue.js的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要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 个节点

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用双指针找到倒数第 N1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时&#xff0c;倒数第 N1 …...

机器人制作开源方案 | 莲花灯

1. 功能描述 莲花灯是一款基于莲花形象设计的机器人&#xff0c;本文示例将用两种模式来实现莲花灯的亮灭功能。 自主模式&#xff1a;用 光强传感器 控制莲花灯的灯叶开合。暗光情况下灯叶打开&#xff0c;灯亮&#xff1b;强光情况下灯叶闭合&#xff0c;灯灭。 …...

华为无线ac+fit三层组网,每个ap发射不同的业务vlan

ap管理dhcp在ac控制器上&#xff0c;业务dhcp在汇聚上 配置WLAN业务 &#xff08;1&#xff09;配置VAP模板 • 配置员工网络的VAP模板&#xff08;employee&#xff09; [AC-wlan-view] security-profile name employee //创建名为“employee”的安全模板 [AC-wlan-sec-prof-…...

人工智能:科技之光,生活之美

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们的生活中&#xff0c;它如同一束璀璨的科技之光&#xff0c;照亮我们生活的每一个角落&#xff0c;使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…...

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. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…...

保姆级教程:用ESP32和MicroPython给ST7735屏幕做个网络时钟(附完整代码)

ESP32MicroPython打造智能网络时钟&#xff1a;从硬件搭建到代码实战 第一次看到朋友用ESP32驱动彩色小屏幕显示实时天气时&#xff0c;我就被这种微型物联网设备的魅力吸引了。作为创客爱好者&#xff0c;我们总希望把手边的零散模块变成真正有用的作品。今天要实现的这个网络…...

小红书数据采集终极指南:5个简单技巧破解反爬限制

小红书数据采集终极指南&#xff1a;5个简单技巧破解反爬限制 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在小红书数据采集领域&#xff0c;许多开发者都面临着动态签名…...

告别TypeError:用f-string和format()优雅地拼接字符串与变量(Python 3.6+实战)

Python字符串格式化实战&#xff1a;从TypeError到优雅拼接 在Python开发中&#xff0c;字符串拼接是最基础却又最容易出错的环节之一。当你在构建动态报告、记录日志或生成API响应时&#xff0c;突然遇到"TypeError: can only concatenate str (not int) to str"这样…...

手把手教你用BERT实战电信诈骗文本分类:从数据脱敏到模型融合的完整流程

电信诈骗文本分类实战指南&#xff1a;从数据清洗到模型部署的全链路解析 电信诈骗案件分类一直是公共安全领域的技术难点。去年接触到一个真实案例&#xff1a;某地反诈中心每天需要处理近千条报案记录&#xff0c;人工分类效率低下导致关键预警延迟。这正是我们需要自动化文本…...

Angular 表单中基于下拉选择动态启用字段必填校验的完整实现方案

本文介绍如何在 Angular 响应式表单中&#xff0c;根据 payable_frequency_ref_id 下拉框的选择状态&#xff0c;动态控制 min_payable_commission 和 max_payable_commission 两个输入框中「任一必填」的自定义校验逻辑&#xff0c;避免硬编码 required 属性或重复调用 setVal…...

智能手机号地理位置查询系统:基于ASP.NET的高效定位解决方案

智能手机号地理位置查询系统&#xff1a;基于ASP.NET的高效定位解决方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/g…...

AISMM团队组建必须避开的6个致命误区,国家级测评中心首席专家亲授“评估效能衰减预警模型”

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM模型评估团队组建指南 组建一支高效、跨职能的AISMM&#xff08;AI Software Maturity Model&#xff09;模型评估团队&#xff0c;是保障AI系统可解释性、鲁棒性与合规性的关键前提。该团队并非传…...

AI编程副驾驶实战指南:从提示词工程到代码审查的工程化协作

1. 项目概述&#xff1a;当AI成为你的编程副驾 如果你是一名开发者&#xff0c;最近几个月一定被各种AI编程工具刷屏了。从Copilot到Claude&#xff0c;再到各种本地模型&#xff0c;它们承诺能帮你写代码、改Bug、甚至重构整个项目。但说实话&#xff0c;刚上手时&#xff0c;…...

【限时公开】AISMM-Agile Gap Analysis工具箱(含17个自检问题+成熟度雷达图生成器)——仅开放至ISO/IEC 33002:2023正式发布前

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM-Agile融合的底层逻辑与价值主张 为什么需要融合&#xff1f; AISMM&#xff08;AI Software Maturity Model&#xff09;关注AI系统在数据治理、模型可追溯性、持续验证与合规性方面的工程化成熟…...

wall-vault:构建高可用AI代理骨干网络,实现密钥管理与智能故障转移

1. 项目概述&#xff1a;一个为AI工作流打造的“永不掉线”中枢如果你和我一样&#xff0c;重度依赖像OpenClaw这样的AI代理框架进行日常开发、写作或自动化&#xff0c;那你一定经历过那种“断线”的恐慌。深夜&#xff0c;一个API密钥配额耗尽&#xff0c;或者服务商突发故障…...