Sharding的基本思想就是要把一个数据库切分为多个部分放到不同的数据库服务器上,从而解决单一数据库的性能问题。简单来说,如果因为表多而数据多,则适合于垂直切分;如果表不多而单张表的数据非常多,则适合于水平切分。现实中,一般都是二者交织在一起而综合使用垂直和水平切分,从而将数据库切分为类似矩阵一样可以无限扩充的数据库服务器阵列。
一、垂直切分
通俗来讲,垂直切分也就是按照业务分库分表。垂直切分的基本思路是分析表间的聚合关系,将关系紧密的表放在一起。
二、水平切分
水平切分就是在表的KEY上做文章,按照一定规则将大表划分为小表分而治之,例如:好友关系表,一般有三种切分规则:
1、按号段切分
以ID数字大小区分,比如:1~10000对应DB1,10001~20000对应DB2,以此类推。
优点:可部分迁移;
缺点:数据分布不均匀。
2、hash取模切分
对ID进行hash(如果ID是数值型的直接用ID值,如果ID是非数值型的可以对其ACSII码求和得出一个值),然后根据切分规模选取一个数字(例如:切分为4个库,则数字为4),用ID的hash值对数字4取模,即ID%4,结果为0的对应DB0,结果为1的对应DB1,结果为2的对应DB2,结果为3的对应DB3,这样数据就非常均匀地分配到4个DB中了。
优点:数据分布均匀;
缺点:数据迁移麻烦,不能按机器性能分摊数据。
3、在认证库中保存数据库配置
建立一个单独的DB用于存储ID与分片DB之间的映射关系,每次访问数据库时先查询这个数据库以得到分片的DB信息,然后进行实际数据操作。
优点:灵活性强,一对一关系;
缺点:每次实际数据操作前都要多一次认证查询操作,性能大打折扣。
当然这几种方式也不是截然分开的,可以根据实际情况混合使用。
数据切分一般都遵循先垂直切分再水平切分的原则进行,垂直切分是否合理直接影响到水平切分后的跨表查询问题,这也是数据切分时最关键的问题。
一、垂直切分
通俗来讲,垂直切分也就是按照业务分库分表。垂直切分的基本思路是分析表间的聚合关系,将关系紧密的表放在一起。
二、水平切分
水平切分就是在表的KEY上做文章,按照一定规则将大表划分为小表分而治之,例如:好友关系表,一般有三种切分规则:
1、按号段切分
以ID数字大小区分,比如:1~10000对应DB1,10001~20000对应DB2,以此类推。
优点:可部分迁移;
缺点:数据分布不均匀。
2、hash取模切分
对ID进行hash(如果ID是数值型的直接用ID值,如果ID是非数值型的可以对其ACSII码求和得出一个值),然后根据切分规模选取一个数字(例如:切分为4个库,则数字为4),用ID的hash值对数字4取模,即ID%4,结果为0的对应DB0,结果为1的对应DB1,结果为2的对应DB2,结果为3的对应DB3,这样数据就非常均匀地分配到4个DB中了。
优点:数据分布均匀;
缺点:数据迁移麻烦,不能按机器性能分摊数据。
3、在认证库中保存数据库配置
建立一个单独的DB用于存储ID与分片DB之间的映射关系,每次访问数据库时先查询这个数据库以得到分片的DB信息,然后进行实际数据操作。
优点:灵活性强,一对一关系;
缺点:每次实际数据操作前都要多一次认证查询操作,性能大打折扣。
当然这几种方式也不是截然分开的,可以根据实际情况混合使用。
数据切分一般都遵循先垂直切分再水平切分的原则进行,垂直切分是否合理直接影响到水平切分后的跨表查询问题,这也是数据切分时最关键的问题。