一、索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。
每张表都有个主键(Primary Key),如果在创建时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
-
首先判断表中是否有非空的唯一索引(Unique NOT NULL),如果有,即作为主键
-
当表中有多个非空唯一索引时,InnoDB存储将选择建表时第一个定义的非空唯一索引为主键。
-
如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。
二、InnoDB逻辑存储结构
从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。
2.1 表空间
默认共享表空间ibdata1,所有数据都存放在这个表空间内。
如果启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内,但回滚(undo)信息,插入缓冲索引页、系统事务信息、二次写缓冲(Double write buffer)等还是存放在原来的共享空间内。
2.2 段
表空间由各个段组成,常见段有数据段、索引段、回滚段等。
InnoDB存储引擎表是索引组织的,因此数据即索引,索引即数据。那么数据段即为B+树的叶子节点,索引段即为B+树的非叶子节点。
2.3 区
区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区。在默认情况下,InnoDB存储引擎页的大小为16KB,即一个区中一共有64个连续的页。
2.4 页
同大多数数据库一样,InnoDB有页(Page)的概念(也可以称为块),页是InnoDB磁盘管理的最小单位。在InnoDB存储引擎中,默认每个页的大小为16KB。而从InnoDB 1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K。若设置完成,则不可以再次修改。除非通过mysqldump导入和导出操作产生新的库。
2.5 行
InnoDB存储引擎是面向行的(row-oriented),也就说数据是按行进行存放。每个页存放的行记录也是有硬性定义的,最多允许存放16KB / 2 - 200行的记录,即7992行记录。
还有面向列(column-oriented)的数据库,如MySQL infobright存储引擎、Sybase IQ、Google Big Table。面向列的数据库对于数据仓库下的分析类SQL语句的执行及数据压缩非常有帮助,是当前数据库发展的一个方向。