mysql分表参数路由策略及库表数的选择

1 分表参数的概念

分表参数即在分库/分表时进行数据表水平拆分使用的数据表字段。通过这些字段水平拆分,将数据水平拆分到划分的物理库中。

进行拆分时,要结合实际业务进行。确定我们所拆分的数据对应的业务对象,明确大多数操作是围绕这个业务对象进行。随后使用这个业务对象对应的字段作为分表参数,进行分库分表。

对于学生信息管理,主要操作围绕学生进行,因此可采用学生这个对象的对应字段进行分表。

对于日志管理,可以通过时间加特定数字参数作为分表参数,这样便于检索操作。

选择分表参数后,要尽量避免特点问题。减少因热点字段导致的导致的数据分布不均匀问题。

不同场景下的主要对象不一样,但类比可以找到合适的字段作为分表参数。

2 多个分表参数的处理方法

通常在我们的业务场景下使用一个分表参数即可。但有时候会遇到查询使用非分表参数查询的场景。

例如在用户订单关系系统,通过用户ID分表。但查询时候却根据订单ID查询。这时查询进行路由时就没法根据用户ID去对应的库表中进行查询。那么有如下几种方式处理。

2.1 全表扫描

  • 方法:我们我们在所有库表上并发查询,随后将结果聚合。如果分了2个库供8个表。那么最终并发去查询8个表,最终把结果输出。
  • 场景: 这种方法应用于对应的非分表参数数据量很小的场景,且业务方对效率性能要求不高。否则不建议使用。

2.2 数据冗余

  • 方法:通过binlog同步一步冗余数据。通过新的字段进行分表查询时去查这张冗余表。新的字段可以根据规则映射到冗余表上。其实就是为新的字段再冗余一套数据,并根据新字段建立分表路由规则。
  • 场景:当全表扫描遇到数据量和查询量较大时,可以考虑使用这种方法。冗余表是同步数据得到,因此仅进行数据查询。主表进行数据插入/查询。

2.3 构造复合分表字段

方法:我们前面提到的订单ID和用户ID。在分表时使用的是用户ID。如何订单ID的一部分和用户ID完全重。那么查询时如果指定了是用户ID,直接通过用户ID路由即可。而如果是通过订单ID查询,那么从订单ID中提取对应的用户ID随后进行路由找到对应的表即可。

场景:当某些情况下多个参数可以组合,字段中可以包含分表字段信息,实现信息共享,这时可以考虑使用这种方法。

2.4 建立映射关系表

当查询用到不同的参数时,可以建立其它参数和分表参数的映射表。

  • 方法:例如可能通过两个参数查询,m是分表参数。n是其它参数。
    建立m和n的对应关系。通过n查询时,先查询关系表。找到对应的m,随后通过m和条件n查询。这样就可以用到分表参数。
分表参数非分表参数
m1n1
m2n2
  • 场景:这种方法原理知道后,场景显而易见。即非分表参数可以和分表参数一一对应。这种方法可以减少数据冗余。但需要增加开发工作。

3 路由策略选择

当有分表参数后,将sql映射到不同库上,这个过程称为路由。常用的有如下几种方式。

3.1 哈希路由

方法:对分表参数进行哈希并取余路由。
优点:请求可均衡分布。
缺点:当表库变更,扩容时,会导致数据位置变更,处理繁琐。因此需要提前规划好容量,一次分好。
场景:在线高性能服务。

3.2 范围路由

方法:将分表参数划分为不同的范围。不同范围内的参数映射到不同的库表。例如用时间,根据时间段划分。
优点:当表库变更,扩容时处理较方便。
缺点:可能导致请求不均匀,造成某个库表被频繁访问,其它库表访问频率较低。
场景:非在线高性能服务。日志服务。运营服务。

4 分库分表数量选择

表数量选择:根据业务经验,单个物理表容量不超过800万行。此外根据业务发展速度,可以估算3-5年的数据增长量。这样估计出总数据量,再根据分库的数量及单表最大数据量算出分表数据量。
估计要合理,否则估计过少,就需要再扩容。数量建议为2^n。

库数量选择:根据预计未来3-5年库的总数据量及单个库的存储量来计算出需要的库的数量。单个库容量根据经验建议小于300G。单机库实例不超过8。

5 总结

使用分库分表就会涉及到分表参数的选择及使用。因此会遇到不同的问题。此外这些问题梳理清楚后,根据不同的路由规则会将请求路由到库表上,这涉及了路由规则的选择。最后根据业务的发展对容量进行规划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值