分库分表之拆分键设计
Tech导读
在处理大规模数据库时,为了提高性能和可扩展性,常常需要将一个庞大的数据库拆分成多个小库或小表,这个过程被称为分库分表。拆分键的设计是这一过程中的关键决策,它影响数据的分布、查询效率以及系统的维护成本。本文将探讨如何根据业务需求和数据访问模式选择合适的拆分键,以实现数据库架构的优化,保证系统的高性能和高可用性。
导读
在处理大规模数据库时,为了提高性能和可扩展性,常常需要将一个庞大的数据库拆分成多个小库或小表,这个过程被称为分库分表。拆分键的设计是这一过程中的关键决策,它影响数据的分布、查询效率以及系统的维护成本。本文将探讨如何根据业务需求和数据访问模式选择合适的拆分键,以实现数据库架构的优化,保证系统的高性能和高可用性。
01 水平、垂直拆分
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
在关系数据库中,当单个库的负载、连接数、并发数等达到数据库的最大上限时,就得考虑做数据库和表的拆分。如一个简单的电商数据库,在业务初期,为了快速验证业务模式,把用户、商品、订单都放到一个数据库中,随着业务的发展及用户量的增长,单数据库逐渐不能支撑业务(MySQL中单记录容量超过1K时,单表数据量建议不超过一千万条),这时就得考虑把数据库和表做出拆分。
垂直拆分:简单的说就是将数据库及表由一个拆分为多个,如我们这里的电商数据库,可以垂直拆分为用户数据库、商品数据库和订单数据库,订单表可以垂直拆分为订单基本信息表,订单收货地址表、订单商品表等,每一个表里保存了一个订单的一部分数据。
水平拆分:简单的说就是将一个库、一个表扩展为多个库,多个表,每一个拆分后的表中保存的依然是一个订单的完整信息。如电商数据库,我们按水平拆分数据库和表后,每一个拆分后的数据库表与现有未拆分前的都保持一致。
常用拆分方法:上述仅从理论上讲解了可行的水平、垂直拆分方法,在实际的生产上,我们拆分一般是按照水平拆表、垂直拆库这一原则进行,在业务比较复杂的场景下也会对表进行垂直拆分。
02
拆分键的选取
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
1、 等值法:
订单表:
拆分键 | 商品编号 | 收货地址 |
Order_id | Sku_code | address |
运单表:
拆分键 | 订单号 | 重量 |
Waybill_code | Order_id | weight |
2、 索引法:
索引表:
非拆分键查询条件 | 拆分键 |
用户编码 | 订单号 |
运单号 | 订单号 |
3、 基因法:
订单表:
拆分键 | 商品编号 | 收货地址 |
Order_id | Sku_code | address |
运单表:
拆分键 | 订单号 | 重量 |
Waybill_code | Order_id | weight |
03 拆分键的生成
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
雪花算法生成的ID是一个64位大小的整数,结构如下:
从其结构可以看出,第一位是符号位,在使用时一般不使用,后面的41位是时间位,是由时间戳来确定的,后面的10位是机器位,最后的12位是生成的ID序列,是每豪秒生成的ID数,即每毫秒可以生成4096个ID。从该结构可以看出,10位机器位决定了使用机器的上限,在某些业务场景下,需要所有的机器使用同一个业务空间,这可能导致机器超限;同时,每一个机器分配后如果机器宕机需要更换时,对ID的回收也需要有相应的策略;最为关键的一点是机器的时间是动态调整的,有可能会出现时间回退几毫秒的情况,如果这个时候获取到这个时间,则会生成重复的ID,导致数据重复。
Leaf: https://github.com/Meituan-Dianping/Leaf
Uid-Generator: https://github.com/baidu/uid-generator
04 提升总结
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
单数据库不能满足业务场景的情况下,主要的思路还是要进行拆分,无论是NoSQL还是关系数据库,随着业务量的增长,都得需要把多个服务器资源组合成一个整体共同来支撑业务。数据库拆分后,如果业务上有多个复杂查询条件的需求,一般就得把数据同步到NoSQL数据库里,由NoSQL来提供支持。无论什么时候,数据库提供的主要能力是存储能力,对于复杂的计算需求,一般是需要在业务逻辑里实现。
求分享
求点赞
求在看