Mysql数据究竟是如何存储的
Mysql行列式
开篇
笔者这几日在学习mysql是这么运行的这本书,感觉书中的内容受益匪浅,想整理成自己的话分享给大家,平时大家工作和生活中可能没有时间去专心投入读取一本书,而mysql是这么运行的这本书需要投入大量的时间的学习,靠碎片化的时间是无法读懂书中的内容的,这本书每一章节的耦合度很高,有兴趣的同学可以去支持一下小孩子老师。下面我会用通俗易懂的白话方式讲述这本书的内容。
Mysql是这么存储数据的?
准备工作
Mysql服务器存储数据其实是交给存储引擎的,而MySQL的存储引擎的又有很多种,例如InnoDB、MyISAM、Memory等等很多种,下面我将以InnoDB存储引擎介绍一下InnoDB存储引擎是如何存储数据的。
InnoDB如何存储数据的
InnoDB是根据数据页(16kb)存储数据的,InnoDB存储引擎会在以数据页的当时将数据在内存种处理,然后在刷入磁盘。那数据页究竟长什么样子。欧克我们下面看一下数据页哪些组成的
| 名称 | 中文名 | 占用空间大小 | 描述 |
|---|---|---|---|
| FileHeader | 文件头部 | 38字节 | 页的一些通用信息 |
| PageHeader | 页面头部 | 56字节 | 数据页占有的一些信息 |
| Infimun+supremun | 最小记录和最大记录 | 26字节 | 两个虚拟的行记录 |
| UserRecordes | 用户记录 | 不确定 | 实际存储的行记录内容 |
| FreeSpace | 空闲空间 | 不确定 | 页中尚未使用的空间 |
| PageDirecttory | 页面目录 | 不确定 | 页中的某些记录的相对位置 |
| FileTailer | 文件尾部 | 8字节 | 检验页是否完整 |
这里不需要我们都记住,混个眼熟就欧克了,我们存储数据发生的空间在UserRecordes(用户记录),看名字不难发现用户记录,肯定是我们自己插入的数据。
首先我们准备一个表名为ROW_FORMAT插入三条数据,
create table ROW_FORMAT(c1 int,c2 varchar(50) NOT NULL,c3 varchar(50),c4 char(50),primary key(c1)
)CHARSET=ascii ROW_FORMAT=COMPACT;
INSERT INTO `ROW_FORMAT`(`c1`,`c2`,`c3`,`c4`)
VALUES(1001,'aaa','ab','aac'),(1002,'bba','bbb','bbc'),(1003,'cca','ccb','ccc');
万事俱备只欠东风,现在我们准备万全,什么你不知道ROW_FORMAT什么意思,这是我们的本章的重点,我们现在已经知道存储操作是InnoDB存储引擎帮我们做的,而InnoDB存储引擎是以数据页存储的,数据页真正存储数据的地方是在UserRecordes中,那么他是如何存储的呢,这就是row_formatd的作用’‘行格式‘’——数据以什么方式存储是行格式说的算的。
行格式有哪几种呢,它们都是这么定义存储的内容的呢,它们之间的区别呢。欧克这些问题我们一个一个的解决。
行格式用哪些?
在InnoDB存储引擎中常见的行格式有四种,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。
Compact行格式是如何存储内容的?
我们看一张图:

变长列列表、空字符列表、头信息是什么?干什么用的?
好我们思考一个问题,如果InnoDB存储引擎插入多条变长数据它应该如何告诉内存真实内容存放的位置。
这下你理解变长列列表的作用了吧,我们看第一行数据是如何存储在Compact行格式里
INSERT INTO `ROW_FORMAT`(`c1`,`c2`,`c3`,`c4`) VALUES(1001,'aaa','aab','aac')

博主你这画的啥啊什么标注都没有,这都这么来的啊

变长列列表里面存放的是边长列表的长度的逆序列表,注意是逆序。
空字符列表是一字节八位00000000:注意得是因为空列表只存储除主键和NOTNULL修饰的列
头信息如上图所示一共占40位
除此之外我们InnoDB引擎还为我们DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR这些默认字段
头信息
预留位1和预留位2没有任何使用,我们跳过。
delete_mask是我们InnoDB引擎在删除数据的时候吧这行数据标记为1就表示它需要被垃圾链路回收。
min_rec_mask是数据页索引的非叶子节点页也就是存储目录记录的页区分在那个开始的。(博主你在讲什么啊,讲到索引的时候你就明白了)
heap_no是数据页为了优化查询设计出每个区最后一个行格式存储这一个区域有多少条数据。
record_type就不再赘述了上图都有。
我们Compact行格式是通过next_record 头信息的指定下一个行格式的位置,形成一个单链表。
总结
compact行格式是里面有四部分组成分别是边长列列表、空字符列表、头信息、真实内容。
其他行列式不同
COMPACT行格式
具体组成如图:

Redundant行格式
具体组成如图:

Dynamic和Compressed行格式
这两种行格式类似于 COMPACT行格式 ,只不过在处理行溢出数据时有点儿分歧,它们不会在记录的真实
数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存
储其他页面的地址。
另外, Compressed 行格式会采用压缩算法对页面进行压缩。
相关文章:
Mysql数据究竟是如何存储的
Mysql行列式 开篇 笔者这几日在学习mysql是这么运行的这本书,感觉书中的内容受益匪浅,想整理成自己的话分享给大家,平时大家工作和生活中可能没有时间去专心投入读取一本书,而mysql是这么运行的这本书需要投入大量的时间的学…...
STM32单片机使用CAN协议进行通信
CAN总线(控制器局域网总线) 理论知识 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信&…...
Docker 入门:如何使用 Docker 容器化 AI 项目(二)
四、将 AI 项目容器化:示例实践 - 完整的图像分类与 API 服务 让我们通过一个更完整的 AI 项目示例,展示如何将 AI 项目容器化。我们以一个基于 TensorFlow 的图像分类模型为例,演示如何将训练、推理、以及 API 服务过程容器化。 4.1 创建 …...
MVVM、MVC、MVP 的区别
MVVM(Model-View-ViewModel)、MVC(Model-View-Controller)和MVP(Model-View-Presenter)是三种常见的软件架构模式,它们在客户端应用开发中被广泛使用。每种模式都有其特定的设计理念和应用场景&…...
【Verilog】期末复习
数字逻辑电路分为哪两类?它们各自的特点是什么? 组合逻辑电路:任意时刻的输出仅仅取决于该时刻的输入,而与电路原来的状态无关 没有记忆功能,只有从输入到输出的通路,没有从输出到输入的回路 时序逻辑电路&…...
C#都可以找哪些工作?
在国内学习C#,可以找的工作主要是以下4个: 1、游戏开发 需要学习C#编程、Unity引擎操作、游戏设计和3D图形处理等。 2、PC桌面应用开发 需要学习C#编程、WinForm框架/WPF框架、MVVM设计模式和UI/UX设计等。 3、Web开发 需要学习C#编程、ASP.NET框架…...
机器学习Python使用scikit-learn工具包详细介绍
一、简介 Scikit-learn是一个开源的机器学习库,用于Python编程语言。它建立在NumPy、SciPy和matplotlib这些科学计算库之上,提供了简单有效的数据挖掘和数据分析工具。Scikit-learn库包含了许多用于分类、回归、聚类和降维的算法,包括支持向量…...
蓝桥杯真题 - 扫雷 - 题解
题目链接:https://www.lanqiao.cn/problems/549/learning/ 个人评价:难度 1 星(满星:5) 前置知识:无 整体思路 按题意模拟;为了减少不必要的“数组越界”判断,让数组下标从 1 1 1…...
vue3项目结合Echarts实现甘特图(可拖拽、选中等操作)
效果图: 图一:选中操作 图二:上下左右拖拽操作 本案例在echarts示例机场航班甘特图的基础上修改 封装ganttEcharts组件,测试数据 airport-schedule.jsonganttEcharts代码: 直接复制粘贴可测…...
Log4j2 插件的简单使用
代码: TestPlugin.java package com.chenjiacheng.webapp.plugins;import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.lookup.StrLookup;/*** Created by chenjiacheng on …...
Linux之RPM和YUM命令
一、RPM命令 1、介绍 RPM(RedHat Package Manager).,RedHat软件包管理工具,类似windows里面的setup,exe是Liux这系列操作系统里而的打包安装工具。 RPMI包的名称格式: Apache-1.3.23-11.i386.rpm “apache’” 软件名称“1.3.23-11” 软件的版本号&am…...
读取硬件板子上的数据
SSCOM工具,先要安装一个插件 这样就可以读到设备数据...
Cesium 实例化潜入潜出
Cesium 实例化潜入潜出 1、WebGL Instance 的原理 狭义的的WebGL 中说使用 Instance, 一般指使用 glDrawArraysInstanced 用于实例化渲染的函数。它允许在一次绘制调用中渲染多个相同的几何体实例,而无需为每个实例发起单独的绘制调用。 Three.js 就是使用这种方…...
java引入jedis并且关于开放redis端口问题
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 引入jedis 编辑 2. 关于java客户端开放redis端口问题 3. 连接redis服务器 redis服务器在官网公开了使用的协议: resp…...
【人工智能】用Python实现情感分析:从简单词典到深度学习方法的演进
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 情感分析是自然语言处理(NLP)中的一个重要任务,其目的是通过分析文本内容,识别出其中的情感极性,如正面、负面或中性。随着技术的不断…...
关系型数据库的完整性和一致性
完整性 1.实体完整性 - 每一个实体都是独一无二的,没有冗余 --主键/唯一索引 2.参照完整性 - 外键 3.域完整性 - 存储的数据都是有效的数据 --数据类型/数据长度/非空约束/检查约束/ 检查约束: alter table tb_score add constraint ck_score_scmar…...
设计模式の命令访问者迭代器模式
文章目录 前言一、命令模式二、访问者模式三、迭代器模式 前言 本篇是关于设计模式中命令模式、访问者模式、以及迭代器模式的学习笔记。 一、命令模式 命令模式是一种行为型设计模式,其核心目的在于将命令的发送者和接受者解耦,提供一个中间层对命令进行…...
信息系统项目管理 -冲突管理
信息系统项目管理题 冲突管理: 项目管理信息系统包括()软件,用于监督资源的使用情况,协助确保合适的资源适时、适地的用于合适活动。 A资源管理或进度计划 BCRM系统 C采购系统或智能分析 DBOM系统 答案:A …...
Gmsh有限元网格剖分(Python)---点、直线、平面的移动
Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转 最近在学习有限元的网格剖分算法,主要还是要参考老外的开源Gmsh库进行,写一些博客记录下学习过程,方便以后回忆嘞。 Gmsh的官方英文文档可以参考:gmsh.pdf 但咋就说&a…...
山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)
1、设计目的 山景提供的SDK是蓝牙音箱demo,用户使用ADC按键或者IR遥控器,进行人机交互。然而现实很多场景,需要和单片机通信,不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
云原生时代的系统设计:架构转型的战略支点
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...
GC1808:高性能音频ADC的卓越之选
在音频处理领域,高质量的音频模数转换器(ADC)是实现精准音频数字化的关键。GC1808,一款96kHz、24bit立体声音频ADC,以其卓越的性能和高性价比脱颖而出,成为众多音频设备制造商的理想选择。 GC1808集成了64倍…...
