InnoDB的数据大部分都是保存在表空间中,包括索引,数据和插入缓存
逻辑结构
InnoDB存储引擎的逻辑存储结构和 Oracle大致相同 ,所有数据都被逻辑地存放在一个空间中 ,我们称之为表空间 ( tablespace ) 。表空间又由段 ( segment ) 、区 ( extent ) 、页 ( page ) 组成 。 InnoDB存储引擎的逻辑存储结构大致如图4-1所示。
InnoDB逻辑存储结构
-
表空间(tablespace)
:表空间可以看做是InnoDB存储引擎逻辑结构的最高层 ,所有的数据都是存放在表空间中。已经介绍了默认情况下 InnoDB存储引擎有一个共享表空间 ibdata1 ,即所有数据都放在这个表空间内 。如果我们启用了参数innodb_file_per_table
,则每张表内的数据可以单独放到一个表空间内 。 -
段(segment)
:表空间由多个段组成,每一个索引在表空间中都有两个段,分别是叶子节点的段和非叶子节点的段。叶子节点保存在一个段内,可以更好的保持叶子节点的连续性,可以提升访问磁盘的效率(因为数据是保存在叶子节点上的) -
区(extend)
:多个页组成一个区(extend),对于不大于16K的页来说,一个区是1M(64个连续的16K页或者128个8K或者256个4K),对于大于16K的页,都都是连续64个页组成一个区,比如128K的页对应2M的区,256的页对应4M的区 -
页(page)
:固定大小的一段连续空间,默认是16K,可以通过参数nnodb_page_size
设置
对于启用了innodb_file_per_table的参数选项,需要注意的是 ,每张表的表空间内存放的只是数据、索引和插入缓冲 ,其他类的数据,如撤销( undo log) 信息、系统事务信息、 二次写缓冲 (double write buffer ) 等还是存放在原来的共享表空间内。
数据行与表空间页的关系
对于<=32K的页,其最大的行大小略小于页大小的一半,比如16K的页对应的行大小为略小于8K。对于大于32K的页,则略小于16K。
如果行内容小于最大行大小,则全部保存在页内,如果超过,InnoDB则会把可变大小的列保存到页外存储(external off-page storage)。(其实也在页里,只不过不在之前的两个页内,而是在一个溢出页,而且每个列都有自己的溢出页)
网友评论