SqlServer 数据库/数据表 拆分(分布式)【转】

摘要:
提示:sqlserver2005版本之后,可以友好的支持“表分区”。在认证库中保存数据库配置就是建立一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行我们需要的查询操作。

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

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

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

SqlServer 数据库/数据表 拆分(分布式)【转】第1张SqlServer 数据库/数据表 拆分(分布式)【转】第2张

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

2. 实现方法:垂直拆分,拆分方式实现起来比较简单,根据表名访问不同的数据库就可以了。横向拆分的规则很多,这里总结前人的几点,

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

优点:可部分迁移

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

(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信息,然后才能进行我们需要的查询操作。

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

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

原文:http://tech.it168.com/a2012/0110/1300/000001300144_2.shtml

免责声明:文章转载自《SqlServer 数据库/数据表 拆分(分布式)【转】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Helm 入门指南npm 安装包失败 --- 清除npm缓存下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 读取串口数据常用函数及实例分析

前记: 人生苦短,我用python,python在做一些算法验证和接口验证方面,的确是非常的好用。读取串口经常用到,这里就做个总结,给自己和周围的人做个备忘吧。 函数解析: 初始化串口数据: importserial #Serial takes two parameters: serial device and baudrate ser = serial....

Oracle数据库LOGGING&NOLOGGING模式概述

1.日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING) 1.1三者的含义 LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是否记录REDO日志,包括在做DML时是否记录REDO日志。一般表上不建议使用NOLOGGING,在创建索引或做大量数据...

Sql Server2008R2与IDEA的连接

数据库的连接笔者搞了一天,参阅了众多连接方案,大部分都是Eclipse和My sql,笔者一遍一遍的调试,终于皇天不负有心人,成绩先摆出来   为了让更多的新手能少走弯路,话不多说,上干货 首先,我们需要下载连接IDEA和sql的驱动包 下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?i...

MongoDB(4.4)使用

MongoDB(4.4)使用 1、MongoDB 安装服务(已经安装的不用) 打开bin目录下的mongod.cfg文件(注意:对应自己的安装路径) 可以看到已经给我们配置好了数据库存放路径和日志存放路径,还有网络设置,若需修改,直接在此处进行修改即可。安装(最好以管理员身份): mongod --config "E:mgbinmongod.cfg" -...

JavaWeb项目之博客系统(二)上

1.JDBC技术 来源:http://zengyiqiang2006.blog.163.com/blog/static/102868226201052673216733/ JDBC技术(访问数据库的一种技术) 核心主要是使用DriverManager类操作和管理实现Driver接口的实现类, 程序员只需要向这个驱动管理器类要连接对象就可以了 ( Conne...

tp5 高效率随机抽取数据(不重复)

public function getRandTable(){ $num = 5; //需要抽取的默认条数 $table = 't_marclog'; //需要抽取的数据表 $countcus = Db::name($table)->count(); //获取总记录数 $min = Db::name(...