MySQL八股学习过程2行的存储 from 小林coding

MySQL数据的存放

下面的命令能够查询到MySQL数据库文件的存放位置

SHOW VARIABLES LIKE 'datadir';

一张表的结构会保存在表同名.frm中,数据会保存在表同名.ibd
表空间的文件结构如下

MySQL表结构

MySQL表结构

  1. 行(ROW)
    数据库表中的记录都是按照行进行存放的,每行根据不同的行格式,有不同的存储结构
  2. 页(page)
    记录按照行的形式组织,但是数据库的读取并不以行为单位,而是以页为单位进行读写的(减少IO,提升效率),默认每个页的大小为16KB
  3. 区(extent)
    InnoDB存储引擎用B+树来组织,并且MySQL对B+树做了一些修改,每一层之间的节点用双向链表连接起来,但是这样会造成一个页面不连续的问题,页面不连续导致磁盘随机IO,因此在表中数据量大的时候,为索引分配空间将不以页为单位,而是以区为单位,每个区的大小为1MB
  4. 段(segment)
    表空间由多个段组成,段是由多个区组成,段有数据段(存放B+树叶节点),索引段(存放B+树非叶节点)和回滚段(回滚数据集合)

InnoDB行格式

四种分别是 Redundant、Compact、Dynamic和 Compressed 行格式
5.7以后默认使用的为Dynamic,Compact格式与Dynamic相似现在讲解Compact行格式
Compact数据格式
记录可以分为记录的额外信息和记录的真实数据两个部分

记录的额外信息

  • 变长字段长度列表
    会将边长数据的真实占用字节数按照列的顺序倒序存储,值得注意的是如果为NULL,那么不会存储到边长的长度字段中
    为何要逆序存储,因为读取头左边是记录头信息,右边是变长字段长度列表,那么将加大边长数据对应的长度与变长数据本身同时存放在一个cache中的概率,提升速度
  • NULL值列表
    某些列可能会存储NULL值,Compact格式将这些NULL值记录到列表中,同样是逆序存储的
  • 记录的头信息
    1. delete_mask:标识记录是否被删除
    2. next_record:下一条记录的位置(可以理解成一个链表指针)
    3. record_type:记录的类型(0为普通记录,1为B+树非叶节点,2为最小记录,3为最大记录)

记录的真实数据

除了我们定义的字段,还有三个隐藏字段

  • rowid
    没有指定主键时将会创建row_id字段
  • trx_id
    事务ID,表示数据由哪个事务生成,trx_id是必须的
  • roll_pointer
    上个版本的指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值