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行格式,记录真实数据的地方只会存放指针了,数据全部存到溢出页
在这里插入图片描述

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

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

相关文章

linux驱动.之 网络udp应用层测试工具demon(一)

绑定vlan&#xff0c;网卡的demon&#xff0c;如果有多个网卡&#xff0c;多个vlan&#xff0c;网卡的ip设置成一致&#xff0c;那就不能只简单绑定ip来创建socket&#xff0c; 需要绑定网卡设备 客户端udp_client.c #include <stdio.h> #include <string.h> #inc…

工业领域的设备“监测”和“检测”有何区别?

在工业领域中&#xff0c;设备的监测和检测是关键的运维活动&#xff0c;它们在保障设备可靠性和生产效率方面发挥着重要作用。尽管这两个术语经常被人们混为一谈&#xff0c;但它们在含义和应用上存在一些关键区别。 "监测"与"检测"的概念 1. 监测&#…

使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板

导语&#xff1a;处理大量的PDF文档可能会变得复杂和耗时。但是&#xff0c;使用Python编程和一些强大的库&#xff0c;如wxPython和PyMuPDF&#xff0c;可以使这个任务变得简单而高效。本文将详细解释一个示例代码&#xff0c;展示如何使用这些库来创建一个可以选择文件夹中的…

vue3插槽的使用方法和优缺点

插槽的使用方法 在Vue 3中&#xff0c;插槽&#xff08;slots&#xff09;是一种用于传递和分发组件内容的灵活机制。插槽可以用来定义组件内部的占位符&#xff0c;然后在父组件中填充具体内容。下面是Vue 3中使用插槽的基本方法&#xff1a; 默认插槽 <!-- ChildCompon…

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

PythonAppium自动化测试环境搭建

Python环境 在CMD中运行 pip install Appium-Python-Client Microsoft Windows [版本 10.0.19045.3693] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>pip install Appium-Python-Client Collecting Appium-Python-ClientDownloading Appium-Python-…

从零开始 通义千问大模型本地化到阿里云通义千问API调用

从零开始 通义千问大模型本地化到阿里云通义千问API调用 一、通义千问大模型介绍 何为“通义千问”&#xff1f; “通义千问大模型”是阿里云推出的一个超大规模的语言模型&#xff0c;具有强大的归纳和理解能力&#xff0c;可以处理各种自然语言处理任务&#xff0c;包括但…

springboot多环境配置

前言 在实际项目研发中&#xff0c;需要针对不同的运行环境&#xff0c;如开发环境、测试环境、生产环境等&#xff0c;每个运行环境的数据库…等配置都不相同&#xff0c;每次发布测试、更新生产都需要手动修改相关系统配置。这种方式特别麻烦&#xff0c;费时费力&#xff0…

参数传递方式

参数传递方式教材上大都说有两种&#xff0c;一种是值传递&#xff0c;另一种是指针传递。而后者本质上依然是值传递。 底层原理 对于值传递还是指针传递&#xff0c;传递的都是相应的值&#xff0c;只不过指针传递传递的是地址的副本&#xff0c;修改副本对原来数据没有任何…

DGL在异构图上进行消息传递

异构图是包含不同类型的节点和边的图。不同类型的节点和边常常具有不同类型的属性。这些属性旨在刻画每一种节点和边的特征。在使用图神经网络时&#xff0c;根据其复杂性&#xff0c; 可能需要使用不同维度的表示来对不同类型的节点和边进行建模。 异构图上的消息传递可以分为…

ProtoBuf的使用

目录 1.创建.proto文件 1.1文件规范 1.2添加注释 1.3指定proto3语法 1.4package声明符 1.5定义消息(message) 1.6定义消息字段 2.编译contacts.proto文件 3.序列化与反序列化的使用 1.创建.proto文件 1.1文件规范 • 创建.proto文件时&#xff0c;⽂件命名应该使用全…

利用互斥锁解决缓存击穿问题

核心思路&#xff1a;相较于原来从缓存中查询不到数据后直接查询数据库而言&#xff0c;现在的方案是 进行查询之后&#xff0c;如果从缓存没有查询到数据&#xff0c;则进行互斥锁的获取&#xff0c;获取互斥锁后&#xff0c;判断是否获得到了锁&#xff0c;如果没有获得到&am…

DNS如何在Windows NIC配置多个DNS服务器时完成DNS解析查询

使用多个 DNS 服务器 IP 配置 DNS 客户端会增加 DNS 基础结构的容错。所以建议给Windows客户端使用多个 DNS 服务器。 文章目录 什么是DNS&#xff1f;在 NIC 上配置单个 DNS 服务器时&#xff0c;DNS 客户端的解析过程在 NIC 上配置两个 DNS 服务器时&#xff0c;DNS 客户端的…

【Docker】从零开始:3.Docker运行原理

【Docker】从零开始&#xff1a;3.Docker运行原理 Docker 工作原理Docker与系统的关系Docker平台架构图解 Docker 工作原理 Docker与系统的关系 Docker 是一个 Client-Server 结构的系统&#xff0c;Docker 守尹进程运行在王机上&#xff0c; 然后通过 Socket 连接从各尸端坊…

Vue3-shallowRef 和 shallowReactive函数(浅层次的响应式)

Vue3-shallowRef 和 shallowReactive函数&#xff08;浅层次的响应式&#xff09; shallowRef函数 功能&#xff1a;只给基本数据类型添加响应式。如果是对象&#xff0c;则不会支持响应式&#xff0c;层成也不会创建Proxy对象。ref和shallowRef在基本数据类型上是没有区别的…

第1关:图的邻接表存储及求邻接点操作

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;要求从文件输入顶点和边数据&#xff0c;包括顶点信息、边、权值等&#xff0c;编写程序实现以下功能。 1&#xff09;构造图G的邻接表和顶点集&#xff0c;即图的存储结构为邻接表。 …

手把手入门MO | 如何使用SeaTunnel将数据写入MatrixOne

1 概述 SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;专注于海量数据&#xff08;包括离线和实时数据&#xff09;同步和转化。MatrixOne 支持使用 SeaTunnel 从其他数据库同步数据&#xff0c;可以稳定高效地处理数百亿条数据。 本文档将介绍如何使用 …

SpringCloud原理-OpenFeign篇(二、OpenFeign包扫描和FeignClient的注册原理)

文章目录 前言正文一、从启动类开始二、EnableFeignClients 的源码分析三、Import FeignClientsRegistrar 的作用四、FeignClientsRegistrar#registerFeignClients(...)五、饥饿注册&懒注册 FeignClientsRegistrar#registerFeignClient(...)六、通过Holder真正注册beanDefi…

SSM框架(一):Spring 容器

文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例&#xff1a;配置数据库4.…

「编程学习书籍总结」提升个人能力从读书开始

✍️作者简介&#xff1a;码农小北&#xff08;专注于Java、Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、…