数据库优化-水平拆分 垂直拆分

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

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

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

SQL Server:数据库/数据表 拆分
▲(纵向拆分)服务器

SQL Server:数据库/数据表 拆分
▲(横向拆分)并发

  1,实现原理:使用垂直拆分,主要要看应用类型是否合适这种拆分方式,如系统能够分为,订单系统,商品管理系统,用户管理系统业务系统比较明的,垂直拆分能很好的起到分散数据库压力的做用。业务模块不明晰,耦合(表关联)度比较高的系统不适合使用这种拆分方式。可是垂直拆分方式并不能完全解决全部压力问题,例如 有一个5000w的订单表,操做起来订单库的压力仍然很大,如咱们须要在这个表中增长(insert)一条新的数据,insert完毕后,数据库会针对这张表从新创建索引,5000w行数据创建索引的系统开销仍是不容忽视的,反过来,假如咱们将这个表分红100个table呢,从table_001一直到table_100,5000w行数据平均下来,每一个子表里边就只有50万行数据,这时候咱们向一张只有50w行数据的table中insert数据后创建索引的时间就会呈数量级的降低,极大了提升了DB的运行时效率,提升了DB的并发量,这种拆分就是横向拆分sqlserver

  2,实现方法:垂直拆分,拆分方式实现起来比较简单,根据表名访问不一样的数据库就能够了。横向拆分的规则不少,这里总结前人的几点,性能

  (1)顺序拆分:如能够按订单的日前按年份才分,2003年的放在db1中,2004年的db2,以此类推。固然也能够按主键标准拆分。server

  优势:可部分迁移htm

  缺点:数据分布不均,可能2003年的订单有100W,2008年的有500W。blog

  (2)hash取模分: 对user_id进行hash(或者若是user_id是数值型的话直接使用user_id的值也可),而后用一个特定的数字,好比应用中须要将一个数据库切分红4个数据库的话,咱们就用4这个数字对user_id的hash值进行取模运算,也就是user_id%4,这样的话每次运算就有四种可能:结果为1的时候对应DB1;结果为2的时候对应DB2;结果为3的时候对应DB3;结果为0的时候对应DB4,这样一来就很是均匀的将数据分配到4个DB中。

  优势:数据分布均匀

  缺点:数据迁移的时候麻烦;不能按照机器性能分摊数据 。

  (3)在认证库中保存数据库配置

  就是创建一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以获得具体的DB信息,而后才能进行咱们须要的查询操做。

  优势:灵活性强,一对一关系

  缺点:每次查询以前都要多一次查询,会形成必定的性能损失。

相关文章
相关标签/搜索