在现如今的业务开发里面,我们一般都会涉及到分库分表的情况,今天这篇文章我们就通过案例的形式来列举下对应的场景和使用策略。
案例一
需求:
订单场景,需要按照用户id或者订单id进行分库分表的场景
策略:
使用hash分库分表的策略
注意事项:
hash分库分表需要拆分列的值的自身分布均匀才能保证hash分布的均衡。
使用限制:
拆分键的数据类型必须是整数类型或者字符串类型。
案例二
需求:
当前的数据存储库是按年月进行分库,表是按订单号分表,订单号的最后3位字符串是一个整数,取值范围是000-999.
策略:
使用str_hash的方式进行分表
注意事项:
使用这个策略进行分表的话只适合点查询的场景,如果是范围查询会触发全表扫描,非常的慢。
使用限制:
1、拆分键的数据类型需为字符串类型(CHAR或VARCHAR)。 2、不支持在建表完成后再调整STR_HASH的参数。
案例三
需求:
1、按用户ID或订单ID进行分库 2、拆分键是整数或字符串类型 3、两张逻辑表需要根据同一个拆分键进行分库,两张表的分表数不同,又经常会按该拆分键进行JOIN的场景
策略:
使用uni_hash的方式进行分表
注意事项:
UNI_HASH算法是简单取模,要求拆分列的值的自身分布均衡才能保证哈希均衡。
使用限制
拆分键的数据类型必须是整数类型或字符串类型。
案例四
需求:
1、需要有两个拆分键,并且查询时仅有其中一个拆分键值的场景
策略:
使用RANGE_HASH的方式进行分表
注意事项:
RANGE_HASH要求拆分列的值的自身分布均衡才能保证哈希均衡。
使用限制
1、拆分键的类型必须是字符类型或数字类型,两个拆分键类型必须保持一致。 2、两个拆分键皆不能修改。 3、折分键暂时不支持做范围查询。 4、插入数据时两个拆分键的后N位需确保一致。 5、字符串长度需不少于N位。
案例五
需求:
1、拆分键大部分键值的低位部分区分度比较低而高位部分区分度比较高
策略:
使用RIGHT_SHIFT的方式进行分表
注意事项:
RIGHT_SHIFT要求拆分列的值的自身分布均衡才能保证哈希均衡。
使用限制
1、拆分键的类型必须整数类型。
案例六
需求:
1、按月份数进行分表,分表的表名即为月份数
策略:
使用MM的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、只能作为分表函数使用,不能作为分库函数使用。 3、按MM进行分表,由于一年的月份只有12个月,所以各分库的分表数不能超过12。
案例七
需求:
1、按日期的天数进行分表
策略:
使用DD的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、只能作为分表函数使用,不能作为分库函数使用。 3、按DD进行分表,由于一个月中日期(DATE_OF_MONTH)的取值范围是1~31,所以各分库的分表数不能超过31。
案例八
需求:
1、YYYYDD函数适用于需要按年份与一年的天数进行分库的场景
策略:
使用YYYYDD的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、使用YYYYDD函数前,需要先确定所需的总物理分表数,您可以通过确定循环周期(如2年)来确定总的物理分表数。因为YYYYDD函数仅支持为循环周期内的每一天创建一张独立分表。 3、当日期经过一个循环周期后(如2012-03-01经过一个2年的循环周期后是2014-03-01),同一个日期有可能被路由到同一个分库分表,具体被分到哪个分表受实际的分表数目影响。
案例九
需求:
1、按周数的日期进行分表,分表表名的下标分别对应一周中的各个日期(星期一到星期天)
策略:
使用WEEK的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、只能作为分表函数使用,但不能作为分库函数。
案例十
需求:
1、按一年中的日期进行分表,分表的表名下标就是一年中的某个日期
策略:
使用MMDD的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、只能作为分表函数使用,但不能作为分库函数。 3、按MMDD进行分表,由于一年最多只有366天,所以各个分库的分表数目不能超过366。
案例十一
需求:
1、按年份与月份进行分库的场景
策略:
使用YYYYMM的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、使用YYYYMM函数前,需要先确定所需的总物理分表数,您可以通过确定循环周期(如2年)来确定总的物理分表数。因为YYYYMM函数仅支持为循环周期内的每一个月创建一张独立分表。 3、当月份经过一个循环周期后(如2012-03经过一个2年的循环周期后是2014-03),相同月份有可能被路由到同一个分库分表,具体被分到哪个分表受实际的分表数目影响。
案例十二
需求:
1、需要按年份与一年的周数进行分库的场景
策略:
使用YYYYWEEK的方式进行分表
使用限制
1、拆分键的类型必须是DATE、DATETIME或TIMESTAMP中的一种。 2、使用YYYYWEEK函数前,需要先确定所需的总物理分表数,您可以通过确定循环周期(如2年)来确定总的物理分表数。因为YYYYWEEK函数仅支持为循环周期内的每一周创建一张独立分表。 3、当周数经过一个循环周期后(如2012年第1周经过一个2年的循环周期后是2014年第1周),相同周数有可能被路由到同一个分库分表,具体被分到哪个分表受实际的分表数目影响。
还没有评论,来说两句吧...