MySQL中怎么存放一条记录

2.2.1. MySQL中一行记录是怎么存储的?

MySQL的数据存储在那个文件?

每创建一个 database(数据库)都会在 /var/lib/mysql/ 目录里面创建一个以 database 为名的目录,然后保存表结构和表数据的文件都会存放在这个目录里。

在数据库目录中包含三个文件: 

  •  db.opt:存储当前数据库的默认字符集和字符校验规则
    • 表名.ibd:存储表数据,也称为独占表空间文件,每张表都有独立的.ibd文件。
    • 表名.firm:存储表结构,每建立一张表都生成一个.firm文件

表空间文件的结构:

表空间由段(segment)、区(extent)、页(page)、行(row)组成

  1. 行(row)

表中的记录都是按行存放,每行记录根据不同的行格式,有不同的存储结构

  1. 页(page)

InnoDB 的数据是按「页」为单位来读写的,每个页默认空间大小是16kb,是InnoDB 存储引擎磁盘管理的最小单元,常见的有数据页、undo 日志页、溢出页等等,行记录是用数据页管理的。

  1. 区(extent)

B+ 树中每一层都是通过双向链表连接的,以页为单位来分配存储空间,链表中相邻的两个页之间的物理位置并不连续,磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。当表中数据量大时,不再以页为单位给索引分配空间,而是按照区。每个区大小为1MB,连续的64的页会被划分为一个区,使链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。

  1. 段(segment)

表空间由各个段组成,段由多个区组成。段一般分为数据段、索引段、和回滚段等。

      • 索引段:存放 B + 树的非叶子节点的区的集合;
      • 数据段:存放 B + 树的叶子节点的区的集合;
      • 回滚段:存放的是回滚数据的区的集合。

InnoDB 行格式有哪些?

行格式(row_format),是一条记录的存储结构。

InnoDB 提供了 4 种行格式,分别是 Redundant、Compact、Dynamic和 Compressed 行格式。

      • Redundant 古老的行格式, MySQL 5.0 版本之前用的行格式,现在基本没人用了。
      • MySQL 5.0 之后引入了 Compact, 是一种紧凑的行格式,为了让一个数据页中可以存放更多的行记录,从 MySQL 5.1 版本之后,行格式默认设置成 Compact。
      • Dynamic 和 Compressed 两个都是紧凑的行格式,它们的行格式都和 Compact 差不多,都是基于 Compact 改进一点东西。从 MySQL5.7 版本之后,默认使用 Dynamic 行格式。

COMPACT 行格式长什么样?

一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。

记录的额外信息:

  1. 变长字段长度列表:

存放记录的真实数据占用的大小,读取时根据「变长字段长度列表」读取对应长度的数据,其他变长字段同理。

用一个实例来进行说明:

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL,
  `name` VARCHAR(20) DEFAULT NULL,
  `phone` VARCHAR(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
  -- 字符集是 ascii(所以每一个字符占用的 1 字节)
) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPACT;

-- 例如,表中有3条记录
+-------------+-------------+-------------------+-------------------+
|  					id| 			 name | 						phone | 							age |
+-------------+-------------+-------------------+-------------------+
|           1 |           a |               123 |                18 |
+-------------+-------------+-------------------+-------------------+
|           2 |          bb |              1234 |              NULL |
+-------------+-------------+-------------------+-------------------+
|           3 |         ccc |              NULL |              NULL |
+-------------+-------------+-------------------+-------------------+
    • 第一条记录:

name字段的值是a,真实数据占用1字节。phone字段的值是123,真实数据占用3字节。age和id不是变长字段。

这些变长字段的真实数据占用的字节数会按照字段的顺序逆序存放。

    • 第三条记录:phone字段是NULL,NULL 不会存放在行格式中记录的真实数据。

为什么「变长字段长度列表」的信息要按照逆序存放?

因为「记录头信息」中指向下一个记录的指针,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。

还可以使位置靠前的 记录的真实数据和数据对应的字段长度信息可以同时在一个 CPU Cache Line 中,这样就可以提高 CPU Cache 的命中率

同样的道理, NULL 值列表的信息也需要逆序存放。

  1. NULL值列表

就是用来存储NULL值的,每个允许NULL值的字段对应一个二进制位,按照字段的顺序逆序排列。二进制位的值是1时,表示该字段是NULL,为0表示不为NULL。NULL值列表必须整数个字节表示,使用的二进制位数不够整个字节,在字节高位补0。

根据三条记录来看NULL值怎么存储的

    • 第一条记录,没有NULL值,用整数字节的二进制位表示NULL,不足8位高位补0。

    • 第二条记录,age字段是NULL,NULL值列表十六进制表示就是0x04。

    • 第三条记录,phone和age字段都是NULL值,NULL值列表十六进制表示就是0x06。

三条记录NULL值列表填充完成后:

每个数据库表的行格式都有「NULL 值列表」吗?

不是,所有字段都是NOT NULL的时候就不会有NULL值列表了,都设置为NOT NULL还能节省至少1字节的存储空间。

  1. 记录头信息

记录头信息中包含的内容很多,列举几个比较重要的:

  • delete_mask :标识此条数据是否被删除。执行 detele 删除记录的时候,并不会真正的删除记录,只是将这个记录的 delete_mask 标记为 1。
  • next_record:下一条记录的位置。记录与记录之间是通过链表组织的。指向的是下一条记录的「记录头信息」和「真实数据」之间的位置。
  • record_type:表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录。

记录的真实数据:

除了自己定义的字段,还有三个隐藏字段,分别为:row_id、trx_id、roll_pointer。

  • row_id:建表的时候指定了主键或者唯一约束列,就没有 row_id 隐藏字段了。如果既没有指定主键,又没有唯一约束, InnoDB 就会为记录添加 row_id 隐藏字段。row_id不是必需的,占用 6 个字节。

  • trx_id:事务id,表示这个数据是由哪个事务生成的。 trx_id是必需的,占用 6 个字节。

  • roll_pointer:记录上一个版本的指针。roll_pointer 是必需的,占用 7 个字节。

VARCHAR()的最大取值范围是多少?

除了 TEXT、BLOB 类型的字段,限制最大为 65535 字节,注意是一行的总长度,不是一列。

要算 varchar(n) 最大能允许存储的字节数,要看数据库表的字符集,不同的字符集,1个字符占用字节不同,比如 ascii 字符集, 1 个字符占用 1 字节, varchar(100) 最大能允许存储 100 字节的数据。

65535个字节中是包含了「变长字段长度列表」和 「NULL 值列表」所占用字节数的,变长字段存储的字节数小于255字节占用1个字节,如果大于255字节占用两个字节。

计算VARCHAR(n)的最大值需要减去「变长字段长度列表」和 「NULL 值列表」所占用的字节数的,

65535-2-1=65532。

在 UTF-8 字符集下,一个字符最多需要三个字节,varchar(n) 的 n 最大取值就是 65532/3 = 21844。

行溢出后,MySQL是怎么处理的?

MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。这个时候就会发生行溢出,多的数据就会存到另外的「溢出页」中

一个页存不下一条记录,记录的真实数据处存放部分数据,然后有20个字节存放溢出页的地址,剩余部分存到溢出页中。

Compressed 和 Dynamic采用完全溢出方式,有数据溢出时,记录的真实数据处只存放20字节的指针,指向溢出页,真实数据都存放在溢出页中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件工程与实践】(第四版)第7章习题答案详解

写在文章开头,感谢你的支持与关注!小卓不羁 第7章 一、填空题二、选择题三、简答题四、实践题 一、填空题 (1)发现软件的错误 (2)白盒法 系统的模块功能规格说明 (3)功能 &#xf…

如何用揿针治疗慢性咽炎?

点击文末领取揿针的视频教程跟直播讲解 在日常生活中,慢性咽炎极为常见,不致命却很恼人。一旦发作,你的喉咙每天都会不舒服,总感觉有东西堵着,但是呢,咳又咳不出来,咽也咽不下去,你…

在一台交换机上配置VLAN

实验环境 实验拓扑图结构如图12.12所示,其中PC1和PC3属于VLAN 2,PC2属于 VLAN 3,PC1的IP地址为192.168.0.2/24,PC2的IP地址为192.168.1.2/24,PC3的 IP地址为192.168.0.3/24。 图12.12 需求描述 要求处于相同VLAN中的主…

JavaScript运算符及优先级全攻略,点击立刻升级你的编程水平!

在编程的世界里,运算符是构建逻辑、实现功能的重要工具。它能帮助我们完成各种复杂的计算和操作。 今天,我们就来深入探索JavaScript中运算符的奥秘,掌握它们的种类和优先级,让你的代码更加高效、简洁! 一、什么是运…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑,是一种动态的,We…

【氮化镓】一种新型的p-GaN/p-AlGaN/AlGaN/GaN异质结场效应晶体管

文章由韩国首尔弘益大学电子与电气工程学院的Dong-Guk Kim等人撰写,题为“P-GaN/p-AlGaN/AlGaN/GaN heterojunction field-effect transistor with a threshold voltage of 6 V”,发表在IEEE Electron Device Letters上。文章提出了一种新型的p-GaN/p-Al…

HTTP:强缓存优化实践

强缓存:浏览器不会向服务器发送任何请求,直接从本地缓存中读取文件 强缓存是指浏览器在向服务器请求资源时,判断本地是否存在该资源的缓存,并判断是否过期。 如果本地缓存未过期,浏览器就直接使用本地缓存&#xff0c…

C#基础|了解对象在程序中的状态及垃圾回收机制

哈喽,你好啊,我是雷工! 本节了解对象的生命周期及对象状态和垃圾回收机制,以下为学习笔记。 1、对象的生命周期 对象在内存中不断地被引用,被释放,形成了类似生命周期的过程。 2、对象在内存中的状态 对…

【2024新windows电脑部署测试环境系列】Jenkins部署 (上)

jenkins对我们测试来说挺重要的,持续集成cicd ,定时任务,远程控制,打包部署测试环境等等。虽然在一些公司,早已用上自研的这种综合控制平台,不过也至少9成以上的组织还是在用jenkins。 一个公司并不一定只有一个jenkin…

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中,我们经常遇到要将坐标数据导入 GIS,生成点位,若是地理坐标系(经纬度),那么直接用 arcgis或者QGIS 导入数据就行了,可实际中总会遇到各种问题: 坐标数据集为大地 200…

(三十二)第 5 章 数组和广义表(稀疏矩阵的十字链表存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

latex使用bib引用参考文献时,正文编号顺序乱序解决办法,两分钟搞定!

一、背景 用Latex写文章时&#xff0c;使用bib添加参考文献是一种最为简便的方式。但有的期刊模板&#xff0c;如机器人顶会IROS&#xff0c;会出现正文参考文献序号没按顺序排列的情况&#xff0c;如下图所示。按理说文献[4]应该是文献[2]&#xff0c;[2]应该是[3]&#xff0…

现代机器学习(ML)技术在医疗成像领域的新应用

现代机器学习(ML)技术在医疗成像领域的新应用主要包括以下几个方面: 一、自动病变检测 使用深度学习算法,尤其是卷积神经网络(CNN),自动识别和分类医学影像中的病变,如肿瘤、炎症等。自动病变检测是现代机器学习技术在医疗成像领域应用的一个重要方向。它主要通过以下…

spark实验求TOP值

实验1&#xff1a;求TOP值 已知存在两个文本文件&#xff0c;file1.txt和file2.txt&#xff0c;内容分别如下&#xff1a; file1.txt 1,1768,50,155 2,1218, 600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 fil…

K8S 哲学 - deployment -- kubectl【create 、 rollout 、edit、scale、set】

kubectl create kubectl rollout kubectl edit kubectl set kubectl scale 1、创建与配置文件解析 2、deploy 滚动更新 &#xff1a;template 里面的内容改变触发滚动更新 编辑该 deploy 的 配置文件 &#xff0c;加入一个 label 不会触发滚动更新 改变 nginx镜…

HTML批量文件上传方案——图像预览方式

作者:私语茶馆 1.HTML多文件上传的关键方案 多文件上传包括:文件有效性校验,文件预览、存储和进度展示多个方面,本章节介绍的是文件预览的实现方案。 2.文件上传前预览 2.1.效果 选择文件前: 选择文件后: 2.2.CSS文件代码 StorageCenter.css代码 html {font-family:…

刚刚!MySQL8.4.0 LTS发布,接着再探

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

郡望是一个什么性质的概念

顾名思义&#xff0c;郡望就是某郡中的望族。 别看现在听起来没什么感觉&#xff0c;在古代却是一个沉甸甸的庞然大物&#xff0c;是标志贵贱的&#xff0c;决定了个人&#xff0c;家庭和家族的未来。 自秦朝实行郡县制&#xff0c;直到唐朝废郡&#xff0c;郡做为一级或州管的…

【AIGC调研系列】LLaVA++整合Phi-3和Llama-3能够实现什么

LLaVA能够为Phi-3和Llama-3带来的主要好处包括&#xff1a; 视觉处理能力的增强&#xff1a;通过整合Phi-3和Llama-3模型&#xff0c;创建了具备视觉处理能力的Phi-3-V和Llama-3-V版本&#xff0c;这意味着这些模型现在能够理解和生成与图像相关的内容[1]。这种能力的增加&…

浅论汽车研发项目数字化管理之道

随着汽车行业竞争不断加剧&#xff0c;汽车厂商能否快速、高质地推出贴合市场需求的新车型已经成为车企竞争的重要手段&#xff0c;而汽车研发具备流程复杂、专业领域多、协作难度大、质量要求高等特点&#xff0c;企业如果缺少科学健全的项目管理体系&#xff0c;将会在汽车研…