`
海浪儿
  • 浏览: 274559 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分库分表对老业务功能带来的冲击

阅读更多

本文为原创,转载请注明出处

分库分表对老业务功能带来的冲击

 

         当业务量发展到一定的程度时,不可避免的需要对数据进行分库分表。以用户的签约数据为例,当用户量很少时,单库单表是可以满足的,但当用户量达到某个级别,譬如亿级,那么单库就会成为瓶颈,需要根据某种维度(譬如userId)来进行分库分表。

分库分表如何实现本文就不阐述了,可以参考一下淘宝的tddl。本文主要阐述分库分表过程中对老业务逻辑带来的冲击以及如何改造,因为有些原来单库单表中很容易实现的功能,一经分库分表后,就变的很棘手,譬如:

      a)根据主键ID(非userId)查询签约信息:

      b)插入数据时,userId为空

      c)联表查询,多个表不在同一个库里

 

1、首先来分析第一个问题:根据主键ID(非userId)查询签约信息。

由于根据userId来进行分库,那么根据ID是无法知道该去哪个库查询,当然可以采取全库扫描,但一般这在性能上是无法接受的,违背了分库分表的初衷。可以采取以下几种方案:

      1.1、在进行查询前,如果能拿到userId,则改造为根据userIdid两个条件去查询。

      1.2、如果拿不到userId,那么对于老数据,需要建立一个前置表,该表存储iduserId的映射关系(即:该表只有两个字段,id和userId)。根据ID查询前,先根据ID去查询前置表,得到userId,然后再根据userIdid两个条件查询。



 

分库分表前



 

分库分表后

需要注意的是,该前置表只需要存储老数据的映射关系(该表的数据由系统发布上线前对老数据迁移得到,发布上线后,不会再有新数据写入),对于新数据,在生成ID时,ID需要包含所属库和所属表的标示,这样根据ID查询新数据时就可以直接路由到具体的库和表了,不需要再查询前置表。那么根据ID如何区分新老数据呢,可以根据ID的长度(一般分库后的ID位数会扩容)

        

2、接着分析第二个问题:插入数据时,userId此时为空

在分库分表前,有些业务流程在执行过程中,插入数据时没有分库分表的维度信息譬如userId,只有执行某个业务操作譬如用户登陆后才能得到userId,然后更新这条记录以补全userId




分库分表前

那么分库分表后,在插入数据的那个时刻,就无法知道该把数据插入到哪个库哪个表。针对这种情况,需要对插入数据的流程进行改造。

先将数据进行临时存储,譬如存储在集中式缓存(tairmemcache等)等用户登陆后拿到userId后,再从缓存中查询出数据,然后再插入数据到DB中。



 

分库分表后

3、再来看第三个问题:联表查询,多个表不在同一个库里

         对联表查询进行拆分,保证被拆分过后的原子查询都落在相同的库里。当然,对于左联结或右联结查询,要特备注意拆分前后结果的一致性,很有可能会出现拆分后结果记录数减少的情况,需要重点测试。

 

 

  • 大小: 5 KB
  • 大小: 15.7 KB
  • 大小: 9.7 KB
  • 大小: 22.3 KB
分享到:
评论

相关推荐

    数据分库分表之二叉树分库分表

    ### 数据分库分表之二叉树分库分表 #### 一、引言与背景 随着互联网技术的快速发展及用户需求的激增,单一数据库系统已难以应对日益增长的数据处理需求。为了提高系统的可扩展性和性能,数据分库分表成为了一种...

    分库分表自动建库表小工具

    综上所述,“分库分表自动建库表小工具”是一款贴合实际业务需求、功能强大的数据库架构优化工具。它通过自动化脚本生成,不仅提升了工作效率,还通过修正重复索引等关键问题,保障了系统的稳定性与高效性。随着...

    springmvc分库分表实际例子

    9. **测试与实践**:本示例项目“fenkefenbiao”包含了一个实际运行的Maven项目,你可以下载并运行,通过实际操作来加深对分库分表概念和技术的理解。 通过学习和实践这个“springmvc分库分表实际例子”,开发者...

    MySQL分库分表技术

    总结,MySQL的分库分表技术是应对大数据量和高并发场景的重要手段,它通过合理的设计和策略,能够有效地提升系统的扩展性和性能,但同时也带来了数据一致性和运维复杂性的挑战。实践中需要根据业务特性选择合适的分...

    分库分表总结

    1. ShardingSphere:由Apache基金会维护的开源项目,提供分库分表、读写分离、数据加密等功能,支持MySQL、Oracle、SQL Server等多种数据库。 2. MyCAT:一个开源的分布式数据库中间件,支持大表分片、读写分离、...

    MySQL 分库分表的实现原理及演示案例

    数据迁移则涉及到分库分表前后数据的迁移策略,如何在不影响业务的前提下完成数据的平滑过渡。 总而言之,MySQL分库分表技术是处理大规模数据存储与访问的重要手段,对于提高系统的性能、扩展性和维护性有着非常...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...

    spring动态数据源+mybatis分库分表

    "spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...

    Python+MySQL分表分库实战

    在数据库架构设计和系统性能优化的领域中,MySQL分库分表技术是处理大规模数据和应对高并发请求的重要手段。...掌握分库分表技术,意味着我们可以更好地应对数据增长带来的挑战,确保系统的稳定性与高性能。

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    5. **PPT.pptx**:这个文件可能包含了关于分库分表的详细讲解,包括原理、实践案例和最佳实践,对深入理解这一主题非常有帮助。 6. **笔记.docx** 和 **01_分库分表的由来.png**、**02_数据库如何拆分.png**:这些...

    sharding + mybatis-plus 分库分表

    "Sharding + Mybatis-Plus 分库分表"的主题就是针对这个问题提出的解决方案。Sharding-JDBC是一个轻量级的Java框架,它可以在不改变任何数据库语义和业务代码的情况下,实现数据库的水平拆分,从而提高系统的并行...

    48_你们当时是如何把系统不停机迁移到分库分表的?.zip

    ”提示了本次讨论的主题,即如何在不中断服务的情况下,对数据库进行分库分表操作。这通常是一个复杂的过程,涉及到数据库架构的调整、数据迁移、双写策略以及回滚计划等关键环节。 描述中给出的链接指向了CSDN...

    MySQL分库分表课件.zip

    MySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库...

    集成sharding-jdbc实现分库分表.zip

    - 数据迁移:在启用分库分表前,可能需要对已有数据进行迁移,确保数据完整性和一致性。 通过以上介绍,我们可以看到Sharding-JDBC在若依项目中的应用能够有效地提升数据库的处理能力,解决单体项目可能面临的性能...

    分库分表Sharding中间件Kamike.divide.zip

    前几天发布了kamike.db>这个ORM中间件,这几天就把我之前写的分库分表功能裁剪一下,然后基于kamike.db进行重构。 现在发布一个基本算法实现完毕的版本,模拟了jdbc的操作过程,实现分库分表。具体使用例子我还...

    sharding分库分表demo

    在分库分表的环境中,MyBatis-Plus可以帮助开发者更方便地操作分布在不同库表中的数据,通过其动态SQL特性,可以轻松应对数据分片带来的复杂查询。 在实际操作中,首先需要配置ShardingSphere的规则,包括数据源、...

    zdal分库分表源码(已编译)

    已编译好的支付宝分库分表插件——zdal,可引入工程进行配置使用,可运行

    Spring MVC +Spring + Mybatis 构建分库分表源码

    在本资源中,我们主要探讨如何使用Spring MVC、Spring和Mybatis这三大流行框架来构建一个支持分库分表的应用。这些技术都是Java Web开发中的关键组件,它们各自承担着不同的职责并协同工作,以实现高效、可扩展的...

    分库分表_基于当当jdbc-sharding

    在大型互联网应用中,随着用户数量和业务数据的增长,单个数据库往往难以承载高并发读写请求,这时就需要采用分布式数据库技术,而分库分表是其中的核心手段。 基于当当的jdbc-sharding框架,我们可以实现数据库的...

Global site tag (gtag.js) - Google Analytics