分表的原因:
当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。
分库分表有垂直切分和水平切分两种:
1、依照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这样的切分称之为数据的垂直(纵向)切分。
2、依据表中的数据的逻辑关系,将同一个表中的数据依照某种条件拆分到多台数据库(主机,当然也可能是同一个数据库)上面。这样的切分称之为数据的水平(横向)切分。
数据的垂直切分
将数据库想象成由非常多个一大块一大块的“数据块”(表)组成,我们垂直的将这些“数据块”切开,然后将他们分散到多台数据库(主机)上面,这样的切分方法就是一个垂直(纵向)的数据切分。
数据的水平切分
数据的垂直切分基本上能够简单的理解为依照表依照模块来切分数据,而水平切分就不再是依照表或者是功能模块来切分了。一般来说,简单的水平切分主要是将某个访问极其频繁的大表再依照某个字段的某种规则来分散到多个表之中。每一个表中包括一部分数据。
简单来说,就是将表中的某些行切分到一个数据库(表),而另外的某些行又切分到其它的数据库(表)中。当然,为了能够比较容易的判定各行数据被切分到哪个数据库(表)中了,切分总是都须要依照某种特定的规则来进行的。
水平分库分表的切分规则主要包括如下几种:
按号段分
user_id为区分,1~1000的对应DB1,1001~2000的对应DB2,以此类推;
优点:可部分迁移
缺点:数据分布不均
hash取模分:
对user_id进行hash,然后用一个特定的数字,比如应用中需要将一个数据库切分成4个数据库的话,我们就用4这个数字对user_id的hash值进行取模运算,也就是user_id%4,这样的话每次运算就有四种可能:结果为0的时候对应DB1;结果为1的时候对应DB2;结果为2的时候对应DB3;结果为3的时候对应DB4,这样一来就非常均匀的将数据分配到4个DB中。如上图所示。
优点:数据分布均匀
缺点:数据迁移的时候麻烦,不能按照机器性能分摊数据
在认证库中保存数据库配置
建立一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行我们需要的查询操作。
优点:灵活性强,一对一关系
缺点:每次查询之前都要多一次查询,性能大打折扣
其他方式
1)按照地理区域:比如按照华东,华南,华北这样来区分业务。
2)按照时间切分,就是将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。
推荐:MySQL教程
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试