1 分库分表
目前数据量不断的增大我们就遇到了问题:
- 单个表数据量太大
- 单个库数据量太大
- 单台数据量服务器压力很大
- 读写速度遇到瓶颈
分库分表目标:减小数据库的负担,缩短查询时间。
1.1 什么是分表
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。表可以分布在同一块磁盘上,也可以在不同的机器上。读写根据事先定义好的规则得到对应的子表名。
1.2 什么是分区
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写操作的还是大表名字,db自动去组织分区的数据。
1.3 什么是分库
分库降低了单点机器的负载
1.4 mysql分布式数据库中间件
1.4.1.1 mysql分表的三种方法
1) 做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等
2) 估计会出现大数据量并且访问频繁的表,将其分为若干个表(hash的方法)
3) 利用merge存储引擎来实现分表
1.4.1.2 数据库做拆分的方式
1)按功能划分(垂直切分)
垂直拆分:
解决问题:表与表之间的io竞争
不解决问题:单表中数据量增长出现的压力
垂直分割表下面的情况下使用
把主码(主键)和一些列放到一个表,然后把主码(主键)和另外的一些列放到另一个表中。将原始表分成多个只包含较少列的表。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割。
优点:
1:垂直分割可以使得行数据变小,一个数据块(Block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block 就少)。
2:垂直分割表可以达到最大化利用Cache的目的。
缺点:
1:表垂直分割后,主码(主键)出现冗余,需要管理冗余列;
2:会引起表连接JOIN操作(增加CPU开销)需要从业务上规避;
2)按表中某一字段值的范围划分(水平切分)
水平拆分:
解决问题:单表中数据量增长出现的压力
不解决问题:表与表之间的io争夺
水平分割通常在下面的情况下使用:
(1)表数据量很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,加快了查询速度。
(2)表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
(3)需要把数据存放到多个介质上。
(4)需要把历史数据和当前的数据拆分开。
优点:
1:降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,加快了查询速度。
缺点:
1:水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
3)拆分的处理难点
3.基于hash的切分
4.基于路由表的切分
单独维护一张路由表,根据用户的某一属性来查找路由表决定使用哪个数据库,这种方式是一种更加通用的方案
优点:id和库的mapping算法可以随意更改
缺点:可能引入额外的单点