InnoDB存储引擎——表的逻辑存储及实现

表的逻辑存储结构

在InnoDB存储引擎上,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table),如果一个表没有指定主键,那么会:

  • 首先判断是否存在唯一非空索引,如果有则为主键。
  • 否则InnoDB会自动创建一个6个字节大小的指针。

所有的数据都被逻辑的存放在一个空间里,成为表空间。表空间又由段(Segment)、区(extent)、页(page)组成。
在这里插入图片描述

  • 表空间
    表空间分为独立表空间和共享表空间。如果启用了独立表空间,那么会存放每张表的数据、索引和插入缓冲Bitmap页,而其他数据,如回滚信息,插入缓冲索引页、系统事务信息、二次写缓冲仍然放在原来的共享表空间中。


  • 常见的段有数据段、索引段、回滚段等。InnoDB是索引组织(index organized)的,因此数据段即为B+树的叶子节点,索引段即为非叶节点;回滚段比较特殊,以后会介绍到。


  • 由连续页组成,每个区都是1MB。


  • 默认大小16KB,在InnoDB 1.2.x开始,可以是4K、8K、16K,设置完成后所有页的大小都相同。

表分区

注意,这里分区和分表不是同一个意思。

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。(实际存放的表变多了

什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。(存放区块变多了)


数据库应用分两类:OLTP(在线事务处理,如电子商务、Blog)和OLAP(在线分析处理,如数据仓库)。
对于OLAP应用,往往会有很多查询去频繁的扫描一张很大的表,比如需要扫描最近一年的数据,如果按照时间戳进行分区,只需要扫描相应的分区即可。
对于OLTP应用,通常不会大规模扫描数据,大部分是通过索引来返回几条记录即可,而根据B+树的远离,对于一张大表,一般的B+树需要经过2-3次的磁盘IO,因此B+树一般能很好的完成操作;而如果做分区,可能分区后的B+树同样高度还是2或者3,没有查询性能上的提升。而如果此时分区设计不对,比如读取主键索引,以前只需要读取2-3次,现在每个分区都需要去读取2-3次磁盘IO了,反而产生的磁盘IO会增加。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值