数据库的横向与纵向分区

2019/11/05 33

通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。提示:sqlserver 2005版本之后,可以友好的支持“表分区”。

纵向(垂直)拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库...这种方式多个数据库之间的表结构不同。

纵向拆分

使用垂直拆分,主要看应用类型是否适合这种拆分方式,如果系统可以分为:订单系统、商品管理系统、用户管理系统等业务系统比较透明,垂直拆分能很好的分散数据库压力。业务模块不明晰,耦合(表关联)度比较高的系统不适合使用这种拆分方式。

纵向(垂直)拆分的方式实现起来比较简单,访问不同数据库即可。如果是后期进行垂直拆分时,对代码会有侵入式影响。

横向(水平)拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。

但是垂直拆分方式并不能彻底解决压力问题,例如,有一个 5000w 的订单表,操作起来订单库的压力仍然很大,如我们需要在这个表中插入一条数据,insert完毕后后,数据库会针对这张表重新建立索引,5000w 行数据建立索引的开销还是不容忽视的,反过来,加入我们将这个表分成 100 个表呢?从 orders_001 一直到 orders_100,5000w 条数据平均下来,每个分表只有 50w 行数据,这时候我们向一张分表中插入数据,建立索引的时间就会数量级下降,极大的提高了数据库效率,这种拆分就是横向拆分。

横向拆分

横向(水平)拆分的规则很多,这里总结前人所总结的。

顺序拆分:如果可以按订单日期年份划分,2013 年的放在 db1 中,2014 年的放在 db2 中,以此类推。

优点: 可部分迁移
缺点:数据分布不均,2003 年的订单可能有 100w,而 2008 年的有 1000w。

Hash 模式:对 UserId 进行 Hash(如果 UserId 时数值型的话,直接使用 UserId 的值也可),然后用一个特定的数字,比如应用中需要将一个数据库分成 4 个数据库的话,我们就用数字 4 对 UserId 的 Hash 值(如果 UserId 时数值型的话,直接使用 UserId 的值)进行取模运算,这样的话,就有四种可能,1、2、3、0,分别放入对应数据库,就非常均匀的分配到了所有的数据库中。

优点:数据分布均匀
缺点:数据库迁移时麻烦;不能按照机器性能分摊数据。

在认证库中保存数据库配置

就是建立一个 DB,这个 DB 单独保存 UserId 到 DB 的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的 DB 信息,然后进行查询操作。

优点:灵活性强,一对一关系。
缺点:多了一次查询,会造成一定的性能损失。

评论