表空间
可以看做是InnoDB存储引擎逻辑结构的最高层,所以数据都是放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,所以的数据都是放在这个表空间中。如果启用了innodb_file_per_table,那么每张表内的数据可以单独放到一个表空间内。
开启了innodb_file_per_table后,每张表的表空间内存放的只是数据、索引和插入缓冲,其他类型的数据,如Undo系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内
段
常见的段有数据段,索引段、回滚段等。那么数据段即为B+树的页节点(leaf node segment),索引段即为B+树的非索引节点(non-leaf node segment)
不是每个对象都有段,表空间是由分散的页和段组成。
区
区是由64个连续的页组成,每个页大小为16KB,即每个区大小为1MB。对于大数据段,InnoDB最多每次可以申请4个区,以此保证数据的顺序性能。
启用了参数innodb_file_per_table后,创建的表默认是96KB。区是64个连续页,那么创建表大小是1MB才对啊?其实是因为每个段 开始时,有32个页大小的碎片页来存放数据,当这些页使用完了才是64个连续页的申请。
页
页是InnoDB磁盘管理的最小单位。
常见的页类型有
数据页:
Undo页:
系统页:
事务数据页:
插入缓冲位图页
插入缓冲空闲列表页:
未压缩的二进制大对象页:
压缩的二进制大对象页:
行
InnoDB存储引擎是面向行的.
页中保存着表中一行行的数据。
变长字段长度列表 | NULL标志位 | 记录头信息 | 列1数据 | 列2数据 |
-
Compact行格式首部是一个非NULL变长字段长度列表,而且是按照列的顺序逆序放置的。当列长度的小于255个字节,用1字节表示;
若大于255个字节,用2个字节表示;变长字段的长度最大不可以超过2个字节。 - 第二个部分是NULL标志位,该位指示了该行数据中是否有NULL值,用1表示,应该是bytes
- 记录头信息(record header),固定占用5个字节(40位)
- 每行数据除了用户定义的行外,还有两个隐藏列,事务ID列和回滚指针列,分别为6个字节和7个字节的大小。如果没有Primary Key,每行还会增加一个6字节的RowID列。
-
名称 大小 描述 () 1 未知 () 1 未知 delete_flag 1 该行是否已经被删除 min_rec_flag 1 为1,如果该记录是预先被定义为最小的记录 n_owned 4 该记录拥有的记录数 heap_no 13 所以堆中该条记录的排序记录 record_type 3 记录类型000=普通 001=B+树节点指针 010=Infimum 011=Supremum 1xx=保留 next_recorder 16 页中下一条记录的相对位置 InnoDB在页内部是通过一种链表的结果来串联各个行记录的
表由共享空间、日志文件组、表结构定义文件组成
以.ibd结尾,数据、索引、表的内部数据字典信息都保存在这个单独的表空间文件;表结构定义文件以frm结尾