mysql笔记(一)- InnoDB记录存储结构

InnoDB是以页为单位在内存和磁盘之间交互,页的大小16k,16384字节,那么一页能存放多少条记录呢?我们首先要了解下记录在磁盘的存储格式,才能计算出一页能够存放多少条。

COMPACT行格式

除了COMPACT行格式InnoDB还有其他几种行格式REDUNDANT、DYNAMIC、COMPRESSED

请添加图片描述

记录的额外信息

  1. 变长字段长度列表
    mysql的一些变长的数据类型:varchar、text等,这些类型的字段长度是多少不固定的,在存储的时候需要把字段的长度也存起来,这样在读取记录的时候才能知道变长字段的实际长度。也就是说这些变长字段存储的空间实际分为两部分
    • 真实的数据内容
    • 该数据占用的字节数

    各变长字段存放的字段长度按照列的顺序逆序存放
  2. NULL值列表
    有些字段可能为NULL,如果都存储在真实数据列会很占空间,所以COMPACT格式把可以为null的字段都保存NULL值列表,用二进制表示是否为null(1代表该列为null;0代表不为null)。可为null的字段大于8个时候,null值列表就需要2个字节来记录了。null值字段逆序存放(高位补0)
  3. 记录头信息
    记录头信息由固定的5个字节长度,40个二进制位。请添加图片描述
名称大小(位)描述
预留位11没有使用
预留位21没有使用
delete_flag1标记该记录是否被删除
min_rec_flag1B+数每层非叶子结点中最小的目录项记录都会添加该标示
n_owned4一个页面中的记录会被分成很多组(利用分组二分法加快页中的记录查找,不用从第一条遍历到最后一条来查找),每个组中最后一个记录的n_owned代表组中的记录条数,其余的记录n_owned值都为0
heap_no13标示当前记录在页面堆中的相对位置
record_type3记录类型 0-普通记录 1-B+数非叶子结点的记录 2-表示Infimum记录 3-表示Superemum记录
next_record16下一条记录的相对位置

记录的真实数据

记录的真实数据处理定义的数据列之外还有一些隐藏列

列名是否必须占用空间描述
row_id6字节行ID,记录的唯一标示
trx_id6字节事物id
roll_pointer7字节回滚指针(undo_log)

ascii编码下, char(M) 是固定占用M个字节,这样字段更新的时候就不需要重新分配空间而产生碎片。

溢出列

当插入的字段长度太大时,会溢出该页,需要额外的页来存储。请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值