MySQL系列(9)--InnoDB数据存储结构

MySQL InnoDB存储结构

MySQL数据结构由日志文件,数据文件,用户表空间,系统表空间等组成。有的相互依赖,有的批次独立。有些问价是必须的,有些则可有可无。本文讲解MySQL InnoDB的表空间文件管理

表空间文件组成结构

新建数据库的时候,InnoDB会生成一个ibdata1的表空间。默认这个文件会存储所有的表数据以及sys_table,sys_columus等系统表的数据。通过设置innodb_file_per_table参数后,可以让每个表都有独立的表空间。用来存储索引,插入缓冲等信息。其余信息保存在默认表空间中。

InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),1 extent = 64 pages,InnoDB存储引擎的逻辑存储结构大致如图所示。

MySQL系列(9)--InnoDB数据存储结构_第1张图片

表空间(Tablespace)

表空间是一个表的数据的结合,启用了innodb_file_per_table的参数选项,则每张表的表空间内存放的只是数据、索引和插入缓冲,其他类的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内

段(segment)

常见的段有数据段、索引段、回滚段等。InnoDB存储引擎对于段的管理是由引擎本身完成。不需要手动设置
并不是每个对象都有段。因此更准确地说,表空间是由分散的页和段组成

区(extent)

区是由64个连续的页组成的,每个页大小为16KB,即每个区的大小为1MB。对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能。

页(page)

同大多数数据库一样,InnoDB有页(page)的概念(也可以称为块),页是InnoDB磁盘管理的最小单位。与Oracle类似的是,Microsoft SQL Server数据库默认每页大小为8KB,不同于InnoDB页的大小(16KB),且不可以更改(也许通过更改源码可以)。

常见的页类型有:

数据页(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存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行存放。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2~200行的记录,即7992行记录。这里提到面向行(row-oriented)的数据库,那么也就是说,还存在有面向列(column-orientied)的数据库。MySQL infobright储存引擎就是按列来存放数据的,这对于数据仓库下的分析类SQL语句的执行以及数据压缩很有好处。类似的数据库还有Sybase IQ、Google Big Table。面向列的数据库是当前数据库发展的一个方向。

物理存储结构

从物理意义上来看,InnoDB表由共享表空间、日志文件组(更准确地说,应该是Redo文件组)、表结构定义文件组成。若将innodb_file_per_table设置为on,则每个表将独立地产生一个表空间文件,以ibd结尾,数据、索引、表的内部数据字典信息都将保存在这个单独的表空间文件中。表结构定义文件以frm结尾,这个是与存储引擎无关的,任何存储引擎的表结构定义文件都一样,为.frm文件。

你可能感兴趣的:(MySQL)