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

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

  • MySQL数据的存放
  • MySQL表结构
  • InnoDB行格式
    • 记录的额外信息
    • 记录的真实数据

MySQL数据的存放

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

SHOW VARIABLES LIKE 'datadir';

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

MySQL表结构

MySQL八股学习过程2行的存储 from 小林coding_第1张图片

  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行格式
MySQL八股学习过程2行的存储 from 小林coding_第2张图片
记录可以分为记录的额外信息和记录的真实数据两个部分

记录的额外信息

  • 变长字段长度列表
    会将边长数据的真实占用字节数按照列的顺序倒序存储,值得注意的是如果为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
    上个版本的指针

你可能感兴趣的:(mysql,学习,数据库)