articleList

33-掌握Sharding-Jdbc分库分表后已经解决的三大问题

2025/03/13 posted in  ShardingJDBC
Tags: 

  • 分库分表解决带来的新问题,学到这里,已经解决了大部分了
    image-20211124152601687

  • 问题一:执行的SQL排序、翻页、函数计算问题

    • 分库后,数据分布再不同的节点上, 跨节点多库进行查询时,会出现limit分页、order by排序等问题
    • 而且当排序字段非分片字段时,更加复杂了,要在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序(也会带来更多的CPU/IO资源损耗)
    • 解决方式
      • 业务上要设计合理,利用好PartitionKey,查询的数据分布同个数据节点上,避免 跨节点多库进行查询时
      • sharding-jdbc在结果合并层自动帮我们解决很多问题(流式归并和内存归并)
  • 问题二:数据库全局主键重复问题

    • 常规表的id是使用自增id进行实现,分库分表后,由于表中数据同时存在不同数据库中,如果用自增id,则会出现冲突问题
    • 解决方式
      • UUID
      • 自研发号器 redis
      • 雪花算法
  • 问题三:分库分表技术选型问题

    • 市场分库分表中间件相对较多,框架各有各的优势与短板,应该如何选择
    • 解决方式
      • 开源产品:主要是Mycat和ShardingJdbc区别,也是被面试官问比较多的
        • 两者设计理念相同,主流程都是SQL解析-->SQL路由-->SQL改写-->结果归并
        • sharding-jdbc(推荐)
          • 基于jdbc驱动,不用额外的proxy,在本地应用层重写Jdbc原生的方法,实现数据库分片形式
          • 是基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的,性能高
          • 代码有侵入性
        • Mycat
          • 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库
          • 客户端所有的jdbc请求都必须要先交给MyCat,再有MyCat转发到具体的真实服务器
          • 缺点是效率偏低,中间包装了一层
          • 代码无侵入性