分库分表理论
分库分表
概述
分库分表一般是由于数据库性能已经到达瓶颈,需要通过对库表做些分库分表处理来解决单库性能问题。
常见分库分表主要是两种类型,水平分库分表/垂直分库分表。
垂直拆分
垂直分表
类似于一张普通的表,通过垂直的方式将表切割成左右两半,如下所示
情景:当有一张表叫人物信息表其中的数据行数比较多,但是每行字段中id字段和name字段都比较短,只有content字段内容比较多,但是在日常业务查询中其实查询最多的只是名字,内容也只是在点进该人内部详细的时候才会用到,此时这种情况就可以说这张表中有冷热字段,且冷字段内容通常较多,占用磁盘较多,这种情况我们采用垂直分表将content字段分割开建一张新表,这样该表磁盘内单页也就可以存储更多的数据行,对于查询也就会尽可能的少去磁盘中查询过的的页,从而提升效率。
垂直分库
类似于垂直分表的思想,是通过业务逻辑和实际数据情况来确定怎么拆分,对于表数量比较多,单库性能有限,则可以将有关联性的表放入A库,将另一部分关联的表放入B库,这样就能将压力分散到多个库上。
水平拆分
水平分表
水平分表是指将一张表水平切开,原本应该在一起的数据给分到两张或多张表中,如下图所示。
情景:如果有一张用户信息user表,由于业务比较好,所以注册的账号很多,这就导致这张表有非常多的数据,导致我们每次查询的时候都非常慢,所以我们可以将user表水平切开,用两张表一样表结构的user01和user02表来存储所有的用户信息,此时我们就可以将单表的压力扩散到两张表上。
水平分库
类似于水平分表,水平分表我们是在同一个库中将一个表分为多个一样的表,水平分库就是根据某种规则将不同唯一标识的数据放入到不同的库中相同表中。
对比分析
总的来说,垂直分要是基于业务分析来做,水平分一般要有合适的规则,决定以哪种方式区分数据去具体哪个库或者哪个表。水平分表在代码层考虑的就比较多,要选择合适的主键生成策略,高性能的算法来处理数据的去向和查询位置,尽可能的防止把所有的库和所有的表都查询一遍。
关于水平分表的策略
1.模取余
方式:根据分片键ID进行取模运算,决定数据进入哪个表中。
优点:思路简单,实现方便。
缺点:扩展起来比较困难,因为在开始的设计的时候已经确定模的大小,之后要是要增加就需要对原来的数据进行迁移。
2.ID范围
方式:通过分片建ID范围来决定进入哪个表。
优点:解决扩展麻烦问题。
缺点:会造成局部表过热问题,因为某个时间段内大量数据都会对其中的某张表进行操作,也就是读写热点问题。
解决:随机分片建ID来分散局部表过热问题。
3.ID范围+模取余
方式:将数据先规定范围,再在每个范围内进行取模求余。
具体说明:根据分片键ID范围来确定进入user01区域内还是user02区域内,每个区域内都有多个表,在区域内进行取模决定进入user01_1还是user01_2等。实质上这种方式跟分库分表是一个道理,上述中的区域可以理解为不同的库,库中通过取模运算决定进入哪张子表,这种方式可以就不容易导致局部过热,或者扩展苦难的问题。
er01_2等。实质上这种方式跟分库分表是一个道理,上述中的区域可以理解为不同的库,库中通过取模运算决定进入哪张子表,这种方式可以就不容易导致局部过热,或者扩展苦难的问题。
因篇幅问题不能全部显示,请点此查看更多更全内容