MySQL InnoDB 存储结构

  • Post author:
  • Post category:mysql




MySQL InnoDB 存储结构


InnoDB存储引擎的关键特性包括:
  1. 插入缓冲(Insert Buffer)
  2. 两次写(Double Write)
  3. 自适应哈希索引(Adaptive Hash Index)
  4. 异步IO(Async IO)
  5. 刷新邻接页


从逻辑上讲

所有的数据都被逻辑的放在一个空间中,称为tablespace

在这里插入图片描述

由上图可以看出,tablespace由segment组成,segment由extend组成,extend由page组成,page由row组成

在MySQL中默认会有一个共享表空间ibdata1,如果设置了innodb_file_per_table=on时,每张表内的数据放在各自的tablespace中,私有tablespace仅包括数据,索引,插入缓冲Bitmap页,而其他的例如回滚信息,插入缓冲索引页,系统事务信息,二次写缓冲等都还是放在共享表空间

  • 常见的段有数据段,索引段,回滚段

  • 区连续的页组成的空间,任何情况下区的大小都为1MB

    为了保证区中页的连续性,InnoDB一次从磁盘中申请4~5个区,默认情况下,页的大小为16K,即一个区有64个页

    注:在启用了innodb_file_per_table之后,创建的表默认大小是96K,每个段开始时有32个页大小的碎片页(fragment page)来存放数据,当这些页使用完成以后,才是32+64个连续页的申请

  • 页是innodb磁盘管理的最小单位,默认大小是16K

    常见的页有:数据页,undo页,系统页,事务数据页等

  • 数据是按行存放的,每页最少两行数据,最多7992行

    溢出行数据存放:INNODB存储引擎是索引组织的,即每页中至少有两行记录,因此如果页中只能存放一行记录,INNODB会自动将行数据放到溢出页中。当发生溢出行的时候,实际数据保存在BLOB页中,数据页只保存数据的前768字节(老的文件格式),新的文件格式(Barracuda)采用完全行溢出的方式,数据页只保存20个字节的指针,BLOB也保存所有数据

数据页的结构:

File Header(文件头)–>38byte

Page Header(页头)–>56byte

Infimun+Supremum Records

User Records(用户记录,即行记录)

Free Space(空闲空间)

Page Directory(页目录)

File Trailer(文件结尾信息)–>8byte

在这里插入图片描述



从物理上讲

InnoDB是基于磁盘储存的,并将其记录按照页的方式管理,因此可将其视为基于磁盘的数据库系统。由于cpu的数据和磁盘速度之间的鸿沟,因此需要缓冲池技术来提高数据库的整体性能

在这里插入图片描述

缓冲池技术简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对于数据库性能的影响。在数据库中进行页的操作,首先将磁盘读到的页放在缓冲池中,这个过程称为将页‘FIX’到缓冲池中,下一次再读取相同的页时,先判断是否在缓冲池中,若存在,则称该页在缓冲池中被命中,直接从缓冲池中读取,若不存在,则从磁盘中读取。

在这里插入图片描述

缓冲池通常是通过LRU算法进行管理,同时还加入midpoint位置,新读取的页,将不会放到链表头端,而是放到midpoint的位置,默认配置下,该位置位于5/8处

参考:

  1. 高性能MySQL 第3版
  2. MySQL技术内幕-InnoDB存储引擎 第2版



版权声明:本文为yingziisme原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。