当前位置:网站首页>MySQL小册子笔记 5 InnoDB 记录存储结构
MySQL小册子笔记 5 InnoDB 记录存储结构
2022-06-23 07:37:00 【morningcat2018】
MySQL小册子笔记 5 InnoDB 记录存储结构
InnoDB 是 MySQL 默认的存储引擎
读写磁盘的速度非常慢,和内存读写差了几个数量级
将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。
也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。
- 我们平时是以
记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为行格式或者记录格式。
4种常用的行格式是 Compact、Redundant、Dynamic 和 Compressed 行格式。
- 指定行格式
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;
ALTER TABLE 表名 ROW_FORMAT=行格式名称;
CREATE TABLE record_format_demo (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)
) CHARSET=ascii ROW_FORMAT=COMPACT;
INSERT INTO record_format_demo(c1, c2, c3, c4) VALUES('aaaa', 'bbb', 'cc', 'morningcat2018'), ('eeee', 'fff', NULL, NULL);
+------+-----+------+---------------------+
| c1 | c2 | c3 | c4 |
+------+-----+------+---------------------+
| aaaa | bbb | cc | morningcat2018 |
| eeee | fff | NULL | NULL |
+------+-----+------+---------------------+
- Compact 行格式
- 记录的额外信息
- 变长字段长度列表
- MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型;这些数据类型的列称为
变长字段 - 这些变长字段占用的存储空间分为两部分:1 真正的数据内容 ,2 占用的字节数
- 各变长字段数据占用的字节数按照列的顺序
逆序存放- 第一条记录中 c1、c2、c4 列都是变长字段,长度分别为 4,2,14 ;所以
变长字段长度列表的值为0E0204(十六进制表示) - 第二条记录中 c4为NULL 不进行记录;所以
变长字段长度列表的值为0304
- 第一条记录中 c1、c2、c4 列都是变长字段,长度分别为 4,2,14 ;所以
- MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型;这些数据类型的列称为
- NULL值列表
- 使用 1bit 存储,1 代表该列的值为NULL;0 代表该列的值不为NULL
- 逆序存放
- 高位补零
- 只有可能为NULL的列才会存储在此;所以 record_format_demo 表的
NULL值列表为 0000 0 c4 c3 c1- 第二条记录中,c3 c4为NULL,值为1 ;所以
NULL值列表为 0000 0110 ;十六进制表示为06
- 第二条记录中,c3 c4为NULL,值为1 ;所以
- 记录头信息
- 固定的
5个字节组成(40 bit)- 预留位1 1bit
- 预留位2 1bit
- delete_mask 1bit 标记该记录是否被删除
- min_rec_mask 1bit B+树的每层非叶子节点中的最小记录都会添加该标记
- n_owned 4bit 表示当前记录拥有的记录数
- heap_no 13bit 表示当前记录在记录堆的位置信息
- record_type 3bit 表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
- next_record 16bit 表示下一条记录的相对位置
- 固定的
- 变长字段长度列表
- 记录的真实数据
- 除了自定义的列的数据以外,MySQL会为每个记录默认的添加一些列(也称为
隐藏列)- DB_ROW_ID 非必须 6byte 行ID,唯一标识一条记录
- DB_TRX_ID 必须 6byte 事务ID
- DB_ROLL_PTR 必须 7byte 回滚指针
- InnoDB表对主键的生成策略
- 优先使用用户自定义主键作为主键
- 没有定义主键,则选取一个Unique键作为主键
- 连Unique键都没有定义的话,则InnoDB会为表默认添加一个名为row_id的隐藏列作为主键
- 第1条记录中
- c3列的值,它是CHAR(10)类型的,它实际存储的字符串是:‘cc’,而ascii字符集中的字节表示是’0x6363’,虽然表示这个字符串只占用了2个字节,但整个c3列仍然占用了10个字节的空间,
- 除真实数据以外的8个字节的统统都用空格字符填充,空格字符在ascii字符集的表示就是0x20
- 除了自定义的列的数据以外,MySQL会为每个记录默认的添加一些列(也称为
- Redundant 行格式
Redundant 行格式是 MySQL5.0 之前用的一种行格式
- 行溢出
一个页一般是16KB,当记录中的数据太多,当前页放不下的时候,会把多余的数据存储到其他页中,这种现象称为行溢出
边栏推荐
- 黄蓉真的存在吗?
- Qt工程报错:-1: error: Cannot run compiler ‘clang++‘. Output:mingw32-make.exe
- MIT CMS.300 Session 12 – IDENTITY CONSTRUCTION 虚拟世界中身份认同的建立 part 2
- openvino系列 18. 通过OpenVINO和OpenCV实现实时的物体识别(RTSP,USB视频读取以及视频文件读取)
- @What is the difference between controller and @restcontroller?
- MySQL gets the system time period
- 职场必备的30套报表模板,满足95%的报表需求,一键套用无需代码
- 快速排序 + 冒泡排序 + 插入排序 + 选择排序
- Using the for loop to output an alphabetic triangle
- socket编程——select模型
猜你喜欢
随机推荐
vtk. JS left mouse button sliding to change window level and window width
openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, b‘DeviceOpen using default: no devices found‘
Capturing packets to find repeated acks and a large number of TCP retransmissions in TCP sessions -- sack (selective acknowledgement) technology
[markdown] markdown tutorial summary
开源软件、自由软件、Copyleft、CC都是啥,傻傻分不清楚?
Vs problems when connecting to SQL myconn OPen(); cannot execute
Playwirght getting started
Introduction to Excel VBA and practical examples
C# richTextBox控制最大行数
Eureka service registration and discovery
【Kubernetes】Kubernetes各大版本的最新版本下载地址
vtk.js鼠标左键滑动改变窗位和窗宽
Eureka服务注册与发现
socket编程(多线程)
Test APK exception control nettraffic attacker development
firewalld 配置文件的位置
transform的结构及用法
three. Solution to stripe shadow and grid shadow in JS
职场必备的30套报表模板,满足95%的报表需求,一键套用无需代码
华为云服务器弹性公网IP无法ping


![[try to hack] IP address](/img/ab/ed91f3094ac913a0d79448a2d19015.png)
![Acwing game 56 [End]](/img/f6/cd650331c819a27f17c9ce6cd0c569.png)


