MySQL八股学习过程2行的存储 from 小林coding
- MySQL数据的存放
- MySQL表结构
- InnoDB行格式
- 记录的额外信息
- 记录的真实数据
MySQL数据的存放
下面的命令能够查询到MySQL数据库文件的存放位置
SHOW VARIABLES LIKE 'datadir';
一张表的结构会保存在表同名.frm中,数据会保存在表同名.ibd
表空间的文件结构如下
MySQL表结构
- 行(ROW)
数据库表中的记录都是按照行进行存放的,每行根据不同的行格式,有不同的存储结构 - 页(page)
记录按照行的形式组织,但是数据库的读取并不以行为单位,而是以页为单位进行读写的(减少IO,提升效率),默认每个页的大小为16KB - 区(extent)
InnoDB存储引擎用B+树来组织,并且MySQL对B+树做了一些修改,每一层之间的节点用双向链表连接起来,但是这样会造成一个页面不连续的问题,页面不连续导致磁盘随机IO,因此在表中数据量大的时候,为索引分配空间将不以页为单位,而是以区为单位,每个区的大小为1MB - 段(segment)
表空间由多个段组成,段是由多个区组成,段有数据段(存放B+树叶节点),索引段(存放B+树非叶节点)和回滚段(回滚数据集合)
InnoDB行格式
四种分别是 Redundant、Compact、Dynamic和 Compressed 行格式
5.7以后默认使用的为Dynamic,Compact格式与Dynamic相似现在讲解Compact行格式
记录可以分为记录的额外信息和记录的真实数据两个部分
记录的额外信息
- 变长字段长度列表
会将边长数据的真实占用字节数按照列的顺序倒序存储,值得注意的是如果为NULL,那么不会存储到边长的长度字段中
为何要逆序存储,因为读取头左边是记录头信息,右边是变长字段长度列表,那么将加大边长数据对应的长度与变长数据本身同时存放在一个cache中的概率,提升速度 - NULL值列表
某些列可能会存储NULL值,Compact格式将这些NULL值记录到列表中,同样是逆序存储的 - 记录的头信息
- delete_mask:标识记录是否被删除
- next_record:下一条记录的位置(可以理解成一个链表指针)
- record_type:记录的类型(0为普通记录,1为B+树非叶节点,2为最小记录,3为最大记录)
记录的真实数据
除了我们定义的字段,还有三个隐藏字段
- rowid
没有指定主键时将会创建row_id字段 - trx_id
事务ID,表示数据由哪个事务生成,trx_id是必须的 - roll_pointer
上个版本的指针