首页 > 其他分享 >分库分表 Sharding: 5. 分片流程与 Sharding 核心问题

分库分表 Sharding: 5. 分片流程与 Sharding 核心问题

时间:2022-10-10 20:40:29浏览次数:86  
标签:分库 分片 Bee 改写 分表 引擎 sql Sharding

5.    分片流程与 Sharding 核心问题
5.1    Bee (JDBC 部分) 的转换流程
Bee 基于 JDBC 操作数据库的流程如下:
1) 使用实体 Javabean (+ 条件表达式 Condtion,对应 SQL 的 where 表达式) 传达操作 DB 的信息;
2) 解析成 DB 能识别的 sql 语句;
3) 调用 JDBC 操作数据库;
4) 处理并返回操作结果。
其中 2)~4) 由 Bee 框架负责,用户一般只需要关注 1) 对应的接口。

5.2    Bee Sharding 分片流程
1. Sharding 拦截器进行拦截,计算和收集分片涉及的数据源名称和表名称等分片信息;
2. 对象解析引擎解析对象 / Condtion 并产生 sql 语句;
3.BeeSql 操作数据库引擎,判断是否有分片;
 3.1 无分片或只是分片到一库一表,走无分片分支;
 3.2 有分片,将走分片分支;
   分片分为以下几种:一库多表;多库多表,只指定库 (全表);全库全表;(一库一表经过优化,不走分片)
   BeeSql 操作数据库引擎处理检测缓存是否有数据,有则返回;
   没有缓存,交由指定分片引擎处理;
   根据分片引擎,选择 4,5,6,7,8 进行处理。
4. 无排序,无分页的,如 delete,update, 单条 insert;
  ShardingModifyEngine 分片引擎
  4.1 改写 sql 引擎对 sql 改写,并记录对应的 ds 
  4.2 ShardingBeeSQLModifyExecutorEngine 引擎,执行分片
      a) 设置当前分片的 Ds;
      b) 交由 BeeSql 操作数据库引擎处理;
        路由到指定 Ds, 并获取相关 Connection;
        执行 Suid 操作,并返回结果;
  4.3 结果合并引擎合并结果
  
5. 查询分片
  ShardingSelectEngine 分片引擎
  5.1
    a) 若有分页,改写分页语句;
    改写 sql (OrderByPagingRewriteSql),
    并记录对应的 ds
  5.2 若是单库多表,且有分页,支持 union all, 不是多表查询,优化查询;
    //b) sql 语句替换表下标
    //c)union all  
    //d) 生成新的复合查询语句;
    //e) 加排序子句;(如果有)
    //f) 加分页,取指定页的一页记录
    //g) 调整参数缓存
   5.3 ShardingBeeSQLExecutorEngine 引擎,执行分片
      a) 设置当前分片的 Ds;
      b) 交由 BeeSql 操作数据库引擎处理;
        路由到指定 Ds, 并获取相关 Connection;
        执行 Suid 操作,并返回结果;
   5.4 结果合并引擎合并结果
   5.5 排序装饰
   5.6 分页装饰
      获取指定的一页数据
   5.7 记录结果到缓存;
   5.8 返回

6. 查询函数分片
  ShardingSelectFunEngine 分片引擎
  6.1 改写 sql 引擎对 sql 改写 (更新具体下标), 并记录对应的 ds
  6.2 ShardingBeeSQLFunExecutorEngine 引擎,执行分片
      a) 设置当前分片的 Ds;
      b) 交由 BeeSql 操作数据库引擎处理;
        路由到指定 Ds, 并获取相关 Connection;
        执行 Suid 操作,并返回结果;
  6.3 结果合并引擎合并结果
  6.4 另外,avg 要使用专门的 ShardingAvgEngine,进行改写 Sql, 合并结果,并处理结果.
  

7. 查询 Json 分片
  ShardingSelectJsonEngine 分片引擎
  该种处理,与 5 的查询分片引擎很类似。只是最后要将结果由 List 转为 Json.
 
8.ShardingSelectListStringArrayEngine
分片的 select 操作
专门为处理返回值是 List<String []> 的类型

5.3    Sharding 核心问题
5.3.1    改写 SQL
5.3.2    结果合并

5.3.3    排序

5.3.4    分页

5.3.5    查询 Json

 

 

Bee 源码地址:

​https://gitee.com/automvc/bee​

​https://github.com/automvc/bee​

Bee 经过 10 几个版本的迭代,ORM 的基本功能已趋于成熟稳定。

Bee 从 2.0 版本开始,将全面支持 Sharding 分库分表功能。

标签:分库,分片,Bee,改写,分表,引擎,sql,Sharding
From: https://blog.51cto.com/u_15822049/5745206

相关文章

  • 分库分表 Sharding:7. Bee 对分片的优化
    7.   Bee对分片的优化7.1   对一库一表的优化最终路由到一库一表,即不会造成分片,因此Bee将其优化为单点操作。7.2   对一库多表的分页查询的优化对一库多表的......
  • 分库分表 Sharding:8. 主流的数据库中间件实现对比
    8.   主流的数据库中间件实现对比8.1   数据库代理与数据源代理典型的数据库中间件设计方案有2种:服务端代理(proxy:代理数据库)、客户端代理(datasource:代理数据......
  • sharding 目前支持和不支持的 sql
     描述:使用sharding 中间件,不支持一些sql具体看官网:​​https://shardingsphere.apache.org/document/current/cn/features/sharding/use-norms/sql/​​......
  • 分库分表中间件 sharding
     任何一个技术的出现,都不是为了秀肌肉而产生的。  sharding jdbc 这个分库分表技术要解决的问题就是,随着数据量级的提升,物理硬件达到瓶颈,单表的性能优化也带来了瓶......
  • 分库分表
     这篇文章主要介绍分库分表,以及分库分表带来的问题、 ## 分库分表的几种形式 水平分库,本质是把相同的表放在不同的机器上。 垂直分库:本质是将多个表拆分到不同的机器......
  • sharding 的遇到的相关坑
    org.springframework.dao.InvalidDataAccessApiUsageException:Can'tfindindex:AggregationSelectItem 这个问题是用 sharding,要对聚合函数起一个别名。 看官网给......
  • 使用sharding 做分库分表以后,插入报错 Executing an update/delete query
    这个问题倘若没有 sharding,那就是在service层缺少了事务注解@Transaction这个问题具体看这里​ 我是跑测试类跑出来的问题,好像做分库分表,不能用测试类来测,只能通过 con......
  • 使用sharding做分库分表,使用jpa,发生的save不报错,数据库缺插不进去数据的问题
     先讲讲问题的诞生,我们项目起初没有引进 sharding分库,而是在项目上线前,才做的分库分表。也就是之前的业务都写好的,所以知道业务代码没有任何问题。 然后引入 sharding......
  • mybatis-plus还可以这样分表
    mybatis-plus还可以这样分表 为什么要分表Mysql是当前互联网系统中使用非常广泛的关系数据库,具有ACID的特性。但是mysql的单表性能会受到表中数据量的限制,主要原因......
  • TSharding:用于蘑菇街交易平台的分库分表组件
     tshardingTShardingisthesimpleshardingcomponentusedinmogujietradeplatform.分库分表业界方案​​​​分库分表TShardingTSharding组件目标很少的资源投入即......