在默认情况下,innodb存储引擎有一个共享表空间ibdata1,所有数据都存放在这个表空间内。如果开启了innodb_file_per_table,则每张表内的数据可以单独放在一个表空间内。
段
表空间由各个段组成,常见的段有数据段、索引段、回滚段等。
数据段即B+树的叶子节点
索引段:B+树的非索引节点
对段的管理是由innodb引擎自身完成的,DBA没有必要进行控制。
区
是由连续页组成的空间,在任何情况下,每个区的大小都是1MB。为了保证区中页的连续性,innodb存储引擎一次从磁盘申请4~5个区。在默认情况下,innodb存储引擎页的大小为16KB,即一个区中一共有64个连续的页。
页
innodb磁盘管理的最小单位,默认每个页的大小为16KB,而从1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K。
在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
innodb存储引擎的数据是按照行存储的,每个页存放的行记录也是有硬性定义的,最多允许存放(16KB/2)-200行的记录,即7992行记录。
innodb存储引擎提供了Compact和Redundant两种格式来存放行记录数据。Redundant格式是为了兼容之前版本而保留的。
在mysql5.1版本中,默认设置为Compact格式。
Compact格式存储的方式:
变长字段长度列表
NULL标志位
记录头信息
列数据
还有两个隐藏列:事务ID transaction ID和回滚指针列 roll pointer
一般认为blob、lob这类大对象列类型的存储会把数据存放在数据页面之外。
行溢出数据
可以将一条记录中的某些数据存储在真正的数据页面之外,一般认为BLOB、LOB这类的大对象列类类型的存储会把数据存放在数据页面之外。即使是varchar依然有可能存放在数据页面之外。
innodb1.0.x版本开始引入了新的文件格式,以前支持Compact和Redundant格式称为Antelope格式,新的文件格式称为Barracuda文化格式。Barracuda文件格式有两种行记录格式:Compressed和Dynamic。
新的两种记录格式对于存放BLOB中的数据采用完全的行溢出的方式。
也即在数据页只存放对应的字节指针,实际的数据都存放在Off Page中,而之前的Compact和Redundant格式会存放768个前缀字节。
Compressed行记录格式的另一个功能就是存储在其中行的数据会以zlib的算法进行压缩。
innodb数据页结构
数据主要存在非叶子节点。
innodb数据页由以下7部分组成:
File Header 文件头
Page Header 页头
Infimun和Supreme Record
User Record 用户记录,行记录
Free Space 空闲空间
Page Directory 页目录
File Trailer 文件结尾信息
参考:《MySQL技术内幕InnoDB存储引擎》 第二版 姜承尧