mysql存储引擎之InnoDB

mysql常用的存储引擎

InnoDB 、 MyISAM 、 Memory每种不同的存储引擎,是为乐不同的特性出现的
InnoDB是mysql5.7的默认存储引擎,支持事物,支持行锁
MyISAM不支持事物,只有表锁
Memory内存性数据库

InnoDB数据格式

InnoDB,数据存储在磁盘上,数据的处理是发生在内存中,磁盘的读写速度相比内存是非常慢的,读取数据时,不能一条一条从磁盘读取,采用和操作系统一致的做法,预读,InnoDB将数据划分为页,磁盘和内存之间的数据交互是以页为基本单位,InnoDB中页的默认大小为16KB,也就是每次读区都是16KB
InnoDB支持四种行格式: Compact 、 Redundant 、Dynamic 和 Compressed
指定行格式语法:

create table 表名 ... row_format = 行格式;
alter table 表名 row_format = 行格式;![请添加图片描述](https://img-blog.csdnimg.cn/922ac15b1fcc4e899451ef2a56449eb8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfNjQxMDQxOTkw,size_20,color_FFFFFF,t_70,g_se,x_16)

Compact行记录格式

请添加图片描述一条记录分成了两部分
记录的额外信息
解释这行记录的一些额外信息,分别是 变长字段长度列表,null值列表(没有允许存储null值的列,null值列表就不存在),记录头信息
变长字段长度列表:mysql支持一些变长的数据类型,如:varchar(m),varbinary(m),以及text类型,这些数据类型列称为 “变长字段”,变长字段中存储字节数据是不固定的,所以需要把变长字段占用的字节数存到变长字段长度列表中,
各变长字段数据占用的字节数按照列的顺序逆序存放
变长字段分为两部分:1.真正的数据内容 2.占用的字节数
变长字段长度列表中只存储非null的列中数据占用的长度

null值列表:采用二进制标志位表示,值为1,该列的值为null,为0,值不为null
如果表中没有允许存储null的咧,则null值列表也就不存在了
二进制标志位按照字段的顺序逆序

记录头信息:固定5个字节,一个40个二进制位,不同位代表不同的含义

名称大小(单位bit)描述|
预留位11没有使用
预留位21没有使用
delete_mark1标记是否被删除
min_rec_mask1b+树的非叶子结点中的最小记录都会添加该标志
n_owned4表示当前记录拥有的记录数
heap_no13表示当前记录在记录堆的位置信息
record_type3记录类型,0普通记录 1b+树非叶子节点记录 2最小记录 3最大记录
next_record16下一条记录的相对位置

记录的真实数据
对于一张表来说,除了我们自定义的字段以外,mysql会为每条记录默认的添加几列(隐藏列),具体为:
DB_ROW_ID 唯一标识一条记录,占用6字节,不是必须的,只有用户没有自定义主键,和一个唯一键时,才会生成
DB_TRX_ID 事物id,占用6字节
DB_ROLL_PTR 回滚指针

Redundant行记录格式

Redundant是mysql5.0版本之前的行记录存储方式,是为了向前兼容请添加图片描述
大致结构一直,不同的地方:
字段长度偏移列表,会把该条记录中所有列(包含隐藏列)的长度都按照你需存储到字段长度偏移列表
记录头信息
记录头信息占用6字节,48个二进制位

名称大小(单位bit)描述|
预留位11没有使用
预留位21没有使用
delete_mark1标记是否被删除
min_rec_mask1b+树的非叶子结点中的最小记录都会添加该标志
n_owned4表示当前记录拥有的记录数
heap_no13表示当前记录在记录堆的位置信息
n_field10记录中列的数量
1byte_offs_flag1标记每个列对应的偏移量是一个字节还是两个字节表示
record_type3记录类型,0普通记录 1b+树非叶子节点记录 2最小记录 3最大记录
next_record16下一条记录的相对位置

有两处不同:
Redundant 行格式多了 n_field 和 1byte_offs_flag 这两个属性。
Redundant 行格式没有 record_type 这个属性。

Dynamic和Compressed行格式

mysql5.7 默认的行格式为Dynamic,这两个行格式和Compact类似,只有在处理行溢出数据时不同,他们两不会在记录的真实数据处存储字段真实数据的前 768 个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址
行溢出
varchar(m)列最多可以占用65535个字节,其中m代表的是最多存储的字符数量
mysql对一条记录占用的最大存储空间是有限制的,除了BLOB或TEXT类型的列之外,其他所有的列(不包含隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节,这65535个字节除了列本身的数据之外,还包含一些其他的数据
例如:
一个varchar(m)类型的列,需要有三部分存储空间,1.真实数据 2.真实数据占用的字节长度 3.null值表示,只有该列有not null属性时才有

mysql中磁盘和内存交互的基本单位为页,一个页的大小一般为16KB,也就是16384字节,一个varchar(m)列就最多可以存储65532个字节,那么一页就存不了一条记录
在 Compact 和 Reduntant 行格式中,对于占用存储空间非常大的列,在本记录的真实数据出只会存储该列的前768个字节的数据和一个用20字节存储指向其他页的地址(20字节包含其他页中数据占用的字节数),这个过程叫做行溢出,储存超出768字节的那些页面也被称为溢出页

行溢出的临界点
mysql规定一个页中至少存放两行记录

InnoDB数据页结构示意图

名称解释占用空间描述
File Header文件头部38 字节页的一些通用信息
Page Header页面头部56 字节数据页专有的一些信息
nfimum + Supremum最小记录和最大记录26 字节两个虚拟的行记录
User Records用户记录不确定实际存储的行记录内容
Free Space空闲空间不确定页中尚未使用的空间
Page Directory页面目录不确定页中的某些记录的相对位置
File Trailer文件尾部8 字节校验页是否完整
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值