表 => 段 => 区 => 页 => 行
表:
- 表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中
段:
表空间是由多个段组成的,常见的段有数据段、索引段、回滚段等
- 因为前面介绍过InnoDB是索引组织的,因此数据即索引,索引即数据
- 那么数据段就是B+树的叶子节点(Leaf node segment)
- 索引段即为B+树的非索引节点(Non-leaf node segment)
- 回滚段比较特殊,在后面介
- 在InnoDB中,对段的管理都是有存储引擎自身完成的,DBA不能也没有必要对其进行空间。这和Oracle数据库中的自动段空间管理(ASSM)类似,从一定程度上简化了DBA对于段的管理
区:
- 区是由连续页组成的空间
- 在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区
- 在默认情况下,InnoDB存储引擎页的大小为16KB,即一个区一共有64个连续的页
- InnoDB 1.0.x开始引入压缩页,即每个页的大小可以通过参数KEY_BLOCK_SIZE设置为2K、4K、8K,因此每个区对应页的数量就应该为512、256、128
- InnoDB 1.2.x开始新增了参数innodb_page_size,通过该参数可以将默认页的大小设置为4K、8K。但是页中的数据库不是压缩。这时区中页的数量同样也为256、128
- 总之,不论页的大小怎么变化,区的大小总是为1M
页:
- 页有时候也称为块
- 页是InnoDB磁盘管理的最小单位
- 在InnoDB存储引擎中,默认每个页的大小为16KB
- 而从InnoDB 1.2.x开始,可以通过innodb_page_size将页的大小设置为4K、8K、16K。若设置完成,则所有页的大小都为innodb_page_size,不可以对其再次进行修改。除非通过mysqldump导入和导出操作来产生新的库
在InnoDB中,常见的页类型有:
- 数据页(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-oriented的数据库
- MySQL infobright存储引擎就是按列来进行存放数据的,这对于数据仓库下的分析类SQL语句的执行及数据压缩非常有帮助。类似的数据库还有Sybase IQ、Google BigTable