当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-水平分表有哪几种路由方式

金三银四精选java面试题-水平分表有哪几种路由方式

来源:图灵教育
时间:2023-12-06 15:31:11
 

水平分表有哪几种路由方式

什么是路由呢?就是数据应该分到哪一张表。

水平分表主要有三种路由方式:

  • 范围路由:选取有序的数据列 (例如,整型、时间戳等) 作为路由的条件,不同分段分散到不同的数据库表中。

我们可以观察一些支付系统,发现只能查一年范围内的支付记录,这个可能就是支付公司按照时间进行了分表。

范围路由

范围路由设计的复杂点主要体现在分段大小的选取上,分段太小会导致切分后子表数量过多,增加维护复杂度;分段太大可能会导致单表依然存在性能问题,一般建议分段大小在 100 万至1000 万之间,具体需要根据业务选取合适的分段大小。

范围路由的优点是可以随着数据的增加平滑地扩充新的表。例如,现在的用户是 100 万,如果增加到 1100 万,只需要增加新的表就可以了,原有的数据不需要动。范围路由的一个比较隐含的缺点是分布不均匀,假如按照 1000 万来进行分表,有可能某个分段实际存储的数据量只有 1000 条,而另外一个分段实际存储的数据量有 1000 万条,还有,可能会导致某一段时间对某一张表的访问过于集中导致性能问题。

  • Hash 路由:选取某个列 (或者某几个列组合也可以) 的值进行 Hash 运算,然后根据 Hash 结果分散到不同的数据库表中。

同样以订单 id 为例,假如我们一开始就规划了 4个数据库表,路由算法可以简单地用 id % 4 的值来表示数据所属的数据库表编号,id 为 12的订单放到编号为 0 的子表中,id为 13的订单放到编号为 1 的子表中。

Hash路由

Hash 路由设计的复杂点主要体现在初始表数量的选取上,表数量太多维护比较麻烦,表数量太少又可能导致单表性能存在问题。而用了 Hash 路由后,增加子表数量是非常麻烦的,所有数据都要重分布。Hash 路由的优缺点和范围路由基本相反,Hash 路由的优点是表数据分布比较均匀,不会出现对某张表过于集中访问的问题,缺点是扩充新的表很麻烦,所有数据都要重分布。

  • 配置路由:配置路由就是路由表,用一张独立的表来记录路由信息。同样以订单id 为例,我们新增一张 order_router 表,这个表包含 order_id 和 table_id 两列 , 根据 order_id 就可以查询对应的 table_id。

配置路由设计简单,使用起来非常灵活,尤其是在扩充表的时候,只需要迁移指定的数据,然后修改路由表就可以了。

配置路由

配置路由的缺点就是必须多查询一次,会影响整体性能;而且路由表本身如果太大(例如,几亿条数据) ,性能同样可能成为瓶颈,如果我们再次将路由表分库分表,则又面临一个死循环式的路由算法选择问题。