Innodb的逻辑存储单元是由大到小分别是tablespace segment exetent page(block)组成
表空间(tablespace)
所有数据都存在表空间中,启用参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间中,每张表空间中存放的只是数据,索引和插入缓冲,其他类的数据,如undo信息,系统事务信息,二次写缓冲等还是存放在原来的共享表空间;
段(segment)
常见的segment有数据段,索引段,回滚段
Innodb是索引聚集表,所以数据就是索引,索引就是数据,数据段即是B+树的页节点(leaf node segment),索引段即为B+树的非索引节点(non-leaf node segment);
段的管理是由引擎本身完成的.
区(extent)
区是由64个连续的页组成,每个页的大小为16k,即每个区的大小为(64*16)=1MB,对于大的数据段,mysql每次最多申请4个区,一次保证数据顺序本能;
页(page)
页是innodb磁盘管理最小单位,Innodb每个页的大小是16K
常见数据类型有:
数据页B-tree NODE
Undo页undo log page
系统页systempage
事务数据页system page
插入缓冲位图页insert buffer bitmap
插入缓冲空闲列表页insertbuffer freebitmap
未压缩二进制大对象页uncompressedBLOB page
压缩二进制大对象页compressedBLOB page
行(row)
Innodb存储引擎是面向行的(row-oriented)也就是数据存放按行存放;
每个页最多可以存放16K/2---200行,也就是7992个行;
每个page大小是16K;
每64个连续的page组成一个extent(1mb);
多个extend和page组成segment;
Segment初始化时,会先初始化32个page,之后根据需要将extent分配给segment,单次最多分配4个extents给segment;
Innodb中一个索引(b-tree)由两个segment组成,其中所有叶子节点(leaf node)存放在一个segment中(更连续,更高效)所有非叶子节点(non leaf nodes)存放在一个segment中;
行记录( row )存放在数据页中( page )里, page 是由 page header ,page trailer , page body 组成.