什么是分库分表?

什么是分库分表?

当数据存量或者数据的吞吐量增大时,服务器的负担就会逐步增加以至于影响读/写的性能和成功率。此时,就需要将数据库进行切分。如果如果将数据库分散到多台数据库服务器,则称为分库;如果将一台数据库服务器上的数据用多张表表示,则称为分表。

如何实现分库分表

从实现手段的本质区别上来看,分库分表的实现手段大约分为两类:垂直和水平。

垂直分库分表

垂直分库分表适用于如下场景:

1. 表的列数过多
2. 表中的信息明显属于多个业务逻辑模块。
3. 表中的信息重要程度差异明显
4. 表中的字段大小差异明显
5. 表中的字段访问频率差异明显

满足以上大部分条件,则表明数据库或表需要进行垂直切分。

垂直分表总结:

1. 回归本源,即网站的业务逻辑。根据业务逻辑分析,从逻辑和语义上看,有哪几类信息。
2. 根据以下特征进行进一步的分类
   
   1>哪些是重要的,哪些是次要的
   
   2>哪些是占空间大的,哪些是占用空间小的。
   
   3>哪些是访问频率高的,哪些是访问频率低的。
3. 根据分析后的结果,尽量将重要的,占用空间小和访问频率高的信息分为一组,将相反的信息分为另一组。
4. 如果不能同时满足多条特征(即重要,又占空间小,或者又重要,访问频率又高等),则优先从数据信息本身的意义考虑分组。

注意:分表之后,所有分出来的表都依然和原来的表共享一个唯一的ID,例如,用户信息进行分表之后,两张表都有用户ID。


水平分库分表

水平分库分表就是横向切分一个库或表,切分后分出来的库或者表依然保持原表结构。

水平分库分表适用场景:

1. 当前单库或单表的数据行数过大,已经导致单库或者单表的读/写出现了性能下降。
2. 尚未出现性能瓶颈,但业务特征导致数据库规模(行数)会持续增长或大幅度增长。

注意:

  • 水平分库分表比垂直分库分表更复杂一些。因为垂直分库分表从编程”解耦“的概念上容易理解,而且水平分库分表在数据库的操作上增加了很多额外的复杂度。
  • 在对数据库进行水平分库分表时,需要解决一个基本的问题:哪一条数据属于哪一个子表呢?

解决方案:

1.固定范围

固定范围,即规定每张表的大小,一旦给出的数据ID超出该表的大小,则将其存到下一张表中。例如,我们规定每张表最多可存储1000条数据,那么999就应该在表1中,如果每张表可存储500条记录,那么999就应该存储在表2中。

优点:

  • 易于理解,易于实现
  • 随着业务和数据规模的增长,数据表均匀增长,理论上可以无限扩展

缺点:

  • 范围的大小不易于掌握,太大则重现了分库分表前的问题,太小则造成太多的子库或者子表,从而造成过重的维护负担。
  • 在某些情况下,不同子库或子表所承担的数据量和吞吐量可能会极不均衡。将有2000条数据的数据库按照每张表存储1000条数据进行分表后,得到两张均衡的表,但数据又增长了99条并且长时间没有再增长,那么第三张表将长时间有99条数据,而其他两张表都是1000条,就造成了服务器资源使用率的不均衡。

2.使用配置表

使用配置表,即再创建一张表,该表专门负责存储从数据ID映射到子表的信息。下面举个例子说明:如表2.1所示,用户ID为0002的会被映射到表tb_02,用户ID为0001的会被映射到表tb_01中,用户ID为0003的会被映射到tb_01以此类推。

表2.1配置表
用户ID表ID
0001tb_01
0002tb_02
0003tb_01
0004tb_01

优点:

  • 易于理解,易于实现
  • 变动灵活,随着业务和数据规模的增长,数据表的增长可以自由控制。
  • 当业务规模和数据规模需要变动时,可以通过修改配置表的数据来快速的修改

缺点:

  • 配置表本身也是表。因此数据规模增长到一定程度时,即使我们需要查询的数据只有从数据ID到表ID也会花费很多时间,这样就陷入了一个循环,配置表本身也面临着需要分库分表的问题。出现这种情况的时候,配置表带来的麻烦和复杂性显然会远远超过解决的问题本身。
  • 为了操作到真正的数据,每次的操作都需要额外对配置表进行一次操作,无论是从网络请求数,延时还是从资源消耗访问来看,都接近是双倍的。对于一些资源紧缺或者性能敏感的应用而言,这是一个较为严重的瓶颈。

3.基于算法的映射

优点:

  可以通过调制映射算法使数据在子表中的分布达到相对均匀,并且无论数据如何增长,每个子表承担的数据都是相对均匀的。

缺点:

  • 实现手段较为复杂,而且需要设计者挑选一个合适当前用例的算法,不至于在数据增长时出现不均匀的子表增长。
  • 当业务变动,扩充新表时需要从新设计映射算法,而映射算法的重新设计有时会造成所有数据都需要从新分布,维护代价将大大增高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值