InnoDB存储引擎的所有数据都逻辑地存储在表空间(tablespace)中,表空间又由段(segment)、区(extent)、页(page)组成、行(row)。
如图:
InnoDB逻辑存储结构.png

1、表空间(tablespace)

所有数据都是存储在表空间中,InnoDB有一个默认的共享表空间ibdata1,每张表也可以有单独的表空间ibd。
单独的表空间中存放的只有数据、索引和插入缓存,其他的数据,如:Undo(撤销)信息,系统事务信息,二次写缓存(double write buffer)等还是存放在共享表空间中。

2、段(segment)

表空间由段组成,常见有数据段、索引段、回滚段。

  • 数据段为B+树的叶子节点,图中的leaf node segment。
  • 索引段为B+树的非索引节点,图中的non-leaf node segment。
  • 回滚段就是图中的rollback segment。

注意:并不是每个对象都有段,因此可以说表空间是由分散的页和段组成。

3、区(extent)

  • 每个区的大小为1MB。对于大的数据段,每次最多可以申请4个区,以此保证数据的顺序性能。
  • 一个区是物理上连续分配的一段空间,每一个段至少会有一个区,在创建一个段时会创建一个默认的区。
  • 如果存储数据时,一个区已经不足以放下更多的数据,此时需要从这个段中分配一个新的区来存放新的数据。
  • 一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是区。

4、页(page)

页是构成区的基本单位,也是InnoDB磁盘管理的最小单位。
常见的页类型有:

  • 数据页(B-tree Node)
  • Undo页(Undo Log Page)
  • 系统页(System Page)
  • 事务数据页(Transaction system Page)
  • 插入缓冲位图页(Insert Buffer Bitmap)
  • 插入缓冲空闲列表页(Insert Buffer Free List)
  • 未压缩的二进制大对象页(Uncompressed BLOB Page)
  • 压缩的二进制大对象页(Compressed BLOB Page)

5、行(row)

InnoDB存储引擎是面向行的,也就是说数据的存放是按行进行存放。

InnoDB存储引擎总是按照主键索引的顺序进行存放的,上面这些可以简单的了解其逻辑存储的结构,
本来想把页的数据结构整理一下,但是感觉东西太多,记不住,了解一下算了。

tencent.jpg