InnoDB逻辑存储结构与分区分表
仅作为笔记
前言
仅作为笔记
一、InnoDB逻辑存储结构
- 从逻辑存储的角度来看,所有的数据都被逻辑地存放在一个空间中,称之为表空间。而表空间由段(segment)、区(extent)、页(page)组成,如下所示:
表空间
- InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。
段
- 表空间由各个段组成,常见的段有数据段、索引段、回滚段等,每个段都由若干个区构成。
区
- 区是由连续地页组成的空间,在任何情况下每个区地大小都为1MB,通常为了保证区中页地连续性,InnoDB存储引擎一次向磁盘申请4到5个区,默认情况下,InnoDB存储引擎页地大小为16KB,即一个区中一共由64个连续地页。
页
- 页是InnoDB磁盘管理的最小单位,在InnoDB存储引擎中,默认每个页的大小为16KB,页的大小在设置好了以后不可以被再次更改。
行
- 数据是按行进行存放的,每个页存放的行记录也是有硬性规定的,最多存放7992行。
二、分区分表分库
- 当读写压力大的时候,可以考虑使用增加Slave机器的方式。
- 但是当增加了Slave后,已经不适合再增加了并且写压力很大时,使用分表分库。
分区
- 原理:将表的数据均衡分摊到不同的存储硬件上,实际上还是一张表
- 方式:
水平分区:通过某个属性列来分割。比如:一个包含五年的话费充值清单可以被分区为5个包含一年的的话费清单。
垂直分区:把某些特定的列划分到特定的分区,减少表的宽度,每个分区都保存了其中列所在的行。 - 应用场景:单张表的查询很慢。数据量很大
分表
- 原理:把一张表分解成N个具有独立存储空间的实体表。分解后每个表较少表的宽度或者是数据量。
- 方式:
水平分表:对表的行进行分区,不同分组中物理分隔的数据组合在一起,表中的所有列都可以在每个分区找到,维持了表的属性结构。
垂直分表:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。 - 应用场景:
1)单表数据量很大、字段很多
2)频繁插入或者联合查询时,速度变慢 - 作用:提高单表并发速度、io效率、写效率,读写锁影响的数据量变小,插入数据库需要重新建立索引的数据减少。
分区和分表对比
- 分区是在逻辑层面进行了水平分割,存储的位置虽然变了,但任然是一张表。
- 分表主要是提升单表的并发能力,磁盘的I/O性能。
- 当访问量大,同时表数据比较大的时候,可以两种方式混用。
- 分表的重点是在数据存取时,如何提高并发能力,而分区是如何突破磁盘的读写能力。
分库
- 应用场景:1)库中表过多,2)单台机器容量不够,3)访问量太大。
- 分库方法:垂直分库(面向跨数据库的事务,join查询等)和水平分库。