ShardingSphere JDBC (三)基本知识介绍

183 阅读4分钟

三 基本知识介绍

3.1 概念

3.1.1 逻辑表

  • 在对表进行分片后,一张表分成了n个表,比如订单表t_order分成如下三张表:t_order_1,t_order_2
  • 此时订单表的逻辑表就是t_order,Sharding-JDBC在进行分片规则配置时针对的就是这张逻辑表

3.1.2 真实表

t_ordr_1,t_order_2 称之为 真实表

3.1.3 数据节点

数据分片的最小单元,由数据源名称和表名称组成,比如:d1.t_order_1

3.1.4 分片键

  • 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。
  • SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,Sharding- Jdbc也支持根据多个字段进行分片。

3.1.5 分片算法

  • 分片算法需要应用方开发者自行实现,可实现的灵 活度非常高。包括:精确分片算法范围分片算法复合分片算法 等。例如:where order_id = ? 将采用精确分片算法,where order_id in (?,?,?)将采用精确分片算法,where order_id BETWEEN ? and ? 将采用范围分片算 法,复合分片算法用于分片键有多个复杂情况。
  • 内置分片算法参考:shardingsphere.apache.org/document/5.…

3.1.6 分片策略

标准分片策略

标准分片策略适用于单分片键,此策略支持 PreciseShardingAlgorithm 和RangeShardingAlgorithm 两个分片算法。

其中 PreciseShardingAlgorithm 是必选的,用于处理 = 和 IN 的分片。RangeShardingAlgorithm 是可选的,用于处理BETWEEN AND, >, <,>=,<= 条件分片,如果不配置RangeShardingAlgorithm,SQL中的条件等将按照全库路由处理。

复合分片策略

复合分片策略,同样支持对 SQL语句中的 =,>, <, >=, <=,IN和 BETWEEN AND 的分片操作。不同的是它支持多分片键,具体分配片细节完全由应用开发者实现。

行表达式分片策略

行表达式分片策略,支持对 SQL语句中的 = 和 IN 的分片操作,但只支持单分片键。这种策略通常用于简单的分片,不需要自定义分片算法,可以直接在配置文件中接着写规则。

t_order_$->{t_order_id % 4} 代表 t_order 对其字段 t_order_id取模,拆分成4张表,而表名分别是t_order_0 到 t_order_3。

Hint分片策略

Hint分片策略,对应上边的Hint分片算法,通过指定分片健而非从 SQL中提取分片健的方式进行分片的策略。

3.1.7 分布式主键生成策略

  • 通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。
  • Sharding-JDBC 内部支持UUID和Snowflake生成分布式主键

3.1.8 广播表

  • 广播表也叫全局表,也就是它会存在于多个库中冗余,避免跨库查询问题。
  • 比如省份、字典等一些基础数据,为了避免分库分表后关联表查询这些基础数据存在跨库问题,所以可以把这些数据同步给每一个数据库节点,这个就叫广播表。

3.1.9 绑定表

  • 我们有些表的数据是存在逻辑的主外键关系的,比如订单表order_info,存的是汇总的商品数,商品金额;订单明细表order_detail,是每个商品的价格,个数等等。或者叫做从属关系,父表和子表的关系。他们之间会经常有关联查询的操作,如果父表的数据和子表的数据分别存储在不同的数据库,跨库关联查询也比较麻烦。
  • 比如order_id=1001的数据在node1,它所有的明细数据也放到node1;order_id=1002的数据在node2,它所有的明细数据都放到node2,这样在关联查询的时候依然是在一个数据库。

3.1.10 路由

应用程序服务器将针对逻辑表编写的 SQL 交给我,我在执行前,要找到 SQL 语句里包含的查询条件(where ......)所对应的分片(物理表),然后再针对这些分片进行查询,这个找分片的过程叫做路由。

3.2 SQL的处理过程

当一个应用服务器节点将一个面向逻辑表编写的查询 SQL 交给我之后,我要做下面几件事:

  • SQL 解析(由我内核中的解析引擎完成):先通过词法解析器将逻辑 SQL 拆分为一个个不可再分的单词,再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。
  • SQL 路由(由我内核中的路由引擎完成):根据解析上下文匹配用户配置的分片策略(关于用户配置的分片策略,我后文会慢慢解释),并生成路由路径,路由路径指示了 SQL 最终要到哪些分片去执行。
  • SQL 改写(由我内核中的改写引擎完成):将 面向逻辑表 SQL 改写为在真实数据库中可以正确执行的语句(逻辑 SQL 到物理 SQL 的映射)。
  • SQL 执行(由我内核中的执行引擎完成):通过多线程执行器异步执行路由和改写之后得到的 SQL 语句。
  • 结果归并(由我内核中的归并引擎完成):将多个执行结果集归并以便于通过统一的 JDBC 接口输出。

具体详细知识参考官方文档,官方文档写的十分清楚:shardingsphere.apache.org/document/5.…