三 基本知识介绍
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.…