• innodb的存储结构


    如下所示,innodb的存储结构包含:表空间,段,区,页(块)

    image

    innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高
    表空间:零散页+段
      独立表空间存放的是:数据、索引、插入缓冲位图页。
      共享表空间存放的是:undo信息、系统事务信息、二次写缓冲、插入缓冲等。共享表空间扩展后就不会回缩了。
    段:存储引擎自动管理
    区:由64个连续的页组成,每个页大小为16K(每个区大小为1M),对于大的数据段,innodb存储引擎每次最多可以申请4个区,以此来保证数据的顺序性能。在每个段开始都有32个页大小的碎片页用来存放数据,当这些页使用完之后才64个连续页申请
    页:innodb磁盘管理的最小单位

    imageimage

    page 结构:File Header(38字节),Page Header(56字节),Infimun和Supremum Records,User Records,Free Space,Page Directory,File Trailer(8字节)
    File header:文件头里面包含了该页所在表空间信息,该页在表空间内的偏移量,该页的checksum值,该页的LSN值,该页的类型,该页的上一页指针,该页的下一页指针,页号
    page header(位置信息、统计信息,状态信息):在页目录中的槽数、第一个记录的指针、指向可重用空间的首指针、当前页在索引树中的位置、索引ID、记录数、已删除记录的字节数、该页中记录的数量(包括最大最小记录)、最后插入记录的位置、最后插入记录的方向、一个方向连续插入记录的数量、修改当前页的最大事务、PAGE_BTR_SEG_LEAF、PAGE_BTR_SEG_TOP
    infimum和supremum record:每个数据页中都有两个虚拟的行,用来限定记录的边界
    user record:实际存储行记录内容
    free space:空闲空间,同样是个链表结构。在一条记录被删除后,该空间会被加入到空闲链表中
    page directory:存放了记录的相对位置,这些记录的指针称为槽
    File Trailer:前面四个字节代表该页的checksum值,最后四个字节与FIle header中的FIL_PAGE_LSN相同,通过比较这两个值来保证页的完整性

    记录行:innodb存储引擎是面向行的。每个页存放的行也有硬性限制:最少2行,最多允许存放16K/2-200行(7992行)的记录
    Antelope文件格式

    •   compact行记录格式:变长字段长度列表(1-2字节)+NULL标志位(1字节)+记录头信息(5字节)+各列数据(除了实际列还有两个隐藏列)

    image

      变长字段长度列表:1-2字节,如果变长字段总和小于256个字符占用一个字节,大于255个字节小于65535个字节用2个字节存储,因为2的16次方=65536,所以一个表的变长字段列总和不能超过65535。
      NULL标志位:标志该行中哪些列为空,用1表示。

      记录头信息:用5个字节表示,记录头中的内容如下:
        delete_flag(1 bit):该行是否被删除
      min_rec_flag(1 bit):如果该记录是预先被定义为最小的记录
      n_owned(4 bit):当前槽位所管理的记录数,对于最小记录所在的分组只能有 1 条记录,最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间
      heap_no(13 bit):当前记录在本页中的位置
      record_type(3 bit):记录类型,000普通,001表示B+树节点指针,010表示Infimum,011表示Supremum,1xx表示保留
      next_record(16 bit):页中下一条记录的相对位置

    imageimage

      列数据:(额外包含,事务id列,回滚指针列,如果没有主键的话还会有个6字节的rowid),如果某列数据为NUll则除了NULL标志位外不占用任何额外的空间。

    •   Rebundant行记录格式:字段长度偏移列表(1-2字节)+记录头信息(6字节)+各列数据

    image

      字段长度偏移列表:1-2字节
      记录头信息:6字节,记录头中的内容如下:
      delete_flag(1 bit):该行是否被删除
      min_rec_flag(1 bit):如果该记录是预先被定义为最小的记录,
      n_owned(4 bit):当前槽位所管理的记录数
      heap_no(13 bit):当前记录在本页中的位置
      n_fields(10 bit):记录中列的数量,所以mysql中单表列的数目最多为210-1=1024-1=1023列
      1byte_offs_flag(1 bit):偏移列表为1字节还是2字节
      next_record(16 bit):页中下一条记录的相对位置

      image

    •   行溢出

      一个页中至少应该有两行记录,如果当前页中只能存放一条记录,那么innodb会自动将行数据存放在真实的数据页之外
      Antelope文件格式的行溢出:

        image

      Barracuda文件格式的行溢出:

          imageimage

    小实验:

    做了个关于innodb表最大支持多少列的实验,发现无论用什么文件格式(DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)文件的列数都不能超过1017列

     

     

     

  • 相关阅读:
    C++对象内存布局③测试多继承中派生类的虚函数在哪一张虚函数表中
    C++对象内存布局⑨VS编译器虚拟继承菱形继承
    C++对象内存布局⑥GCC编译器虚拟继承的虚基类表可能有两个
    C++对象内存布局⑦VS编译器虚拟继承多个基类
    C++对象内存布局⑧GCC编译器虚拟继承多个基类
    C++对象内存布局②测试派生类跟基类的虚函数表
    C++对象内存布局④VS编译器单个虚拟继承
    关于gridview绑定数据为空时的界面设计
    防止浏览器不小心被关闭的方法
    javascript 继承之原型链
  • 原文地址:https://www.cnblogs.com/janehoo/p/6202240.html
Copyright © 2020-2023  润新知