为什么别人能用好 MySQL?万字详解其复杂原理( 四 )

  • 缺点:fsync 操作需要作用的多个表空间文件,比只对系统表空间这一个文件进行fsync操作会多一些 IO 操作 。此外,mysqld需要维护更多的文件描述符 。
  • 表空间文件结构InnoDB 表空间文件 .ibd 初始大小为 96K,而InnoDB默认页大小为 16K,页大小也可以通过 innodb_page_size 配置为 4K, 8K…64K 等 。在ibd文件中,0-16KB偏移量即为0号数据页,16KB-32KB的为1号数据页,以此类推 。页的头尾除了一些元信息外,还有Checksum校验值,这些校验值在写入磁盘前计算得到,当从磁盘中读取时,重新计算校验值并与数据页中存储的对比,如果发现不同,则会导致 MySQL 崩溃 。
    ibd文件存储结构如下所示:
    为什么别人能用好 MySQL?万字详解其复杂原理

    文章插图
     
    ibd文件存储结构
    InnoDB页分为INDEX页、Undo页、系统页,IBUF_BITMAP页, INODE页等多种 。
    • 第0页是 FSP_HDR 页,主要用于跟踪表空间,空闲链表、碎片页以及区等信息 。
    • 第1页是 IBUF_BITMAP 页,保存Change Buffer的位图 。
    • 第2页是 INODE 页,用于存储区和单独分配的碎片页信息,包括FULL、FREE、NOT_FULL 等页列表的基础结点信息(基础结点信息记录了列表的起始和结束页号和偏移等),这些结点指向的是 FSP_HDR 页中的项,用于记录页的使用情况,它们之间关系如下图所示 。
    • 第3页开始是索引页 INDEX(B-tree node),从 0xc000(每页16K) 开始,后面还有些分配的未使用的页 。
    可以在 innodb_sys_tables 表中查到表t的表空间ID为28,然后可以在 innodb_buffer_page查到所有页信息,一共4个页 。分别是 FSP_HDR, IBUF_BITMAP, INODE, INDEX 。
    select * from information_schema.innodb_sys_tables where name='test/t';select * from information_schema.innodb_buffer_page where SPACE=28;索引页分析InnoDB引擎索引页的结构如下图,可以用 hexdump查看 t.ibd 文件,然后对照InnoDB页的结构分析下各个页的字段 。
    为什么别人能用好 MySQL?万字详解其复杂原理

    文章插图
     
    索引页结构
    # hexdump -C t.ibd0000c000  95 45 82 8a 00 00 00 03  ff ff ff ff ff ff ff ff  |.E..............|0000c010  00 00 00 00 00 28 85 7c  45 bf 00 00 00 00 00 00  |.....(.|E.......|0000c020  00 00 00 00 00 1c 00 02  00 b0 80 04 00 00 00 00  |................|0000c030  00 9a 00 02 00 01 00 02  00 00 00 00 00 00 00 00  |................|0000c040  00 00 00 00 00 00 00 00  00 2f 00 00 00 1c 00 00  |........./......|0000c050  00 02 00 f2 00 00 00 1c  00 00 00 02 00 32 01 00  |.............2..|0000c060  02 00 1c 69 6e 66 69 6d  75 6d 00 03 00 0b 00 00  |...infimum......|0000c070  73 75 70 72 65 6d 75 6d  03 00 00 00 10 00 1b 80  |supremum........|0000c080  00 00 01 00 00 00 00 05  68 d1 00 00 01 54 01 10  |........h....T..|0000c090  61 62 63 05 00 00 00 18  ff d6 80 00 00 02 00 00  |abc.............|0000c0a0  00 00 05 69 d2 00 00 01  55 01 10 64 65 66 67 68  |...i....U..defgh|0000c0b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|*0000fff0  00 00 00 00 00 70 00 63  95 45 82 8a 00 28 85 7c  |.....p.c.E...(.||00010000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|