Mysql存储结构

表 => 段 => 区 => 页 => 行

表:

  • 表空间可以看做是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

 

Mysql存储结构

上一篇:RandomAccess接口的使用


下一篇:SecureCRT使用专题