1 核心概念
- 真实表
物理表。
- 逻辑表
不考虑数据的实际存放位置,将分别存放在不同数据库分片中的数据,仍然使用同一个名称来操作的表结构的名称。这个名称就是逻辑表的表名。
- 数据节点
在分片之后,数据实际存放在某个数据库分片的位置信息。如节点1、节点2。
- 绑定表
指的是分片规则一致的关系表(主表、子表)。子表数据与有关联关系的主表数据,将存储在同一个数据库分片中。可以提升关联查询效率。
- 广播表
也称为全局表。在使用中,有些表没必要做分片,例如字典表、省份信息等,因为他们数据量不大,数据变化小,而且这种表可能需要与海量数据的表进行关联查询。
广播表会在所有的数据节点上都进行存储,并且存储的表结构和数据完全相同。
2 分片流程解析
2.1 SQL解析
分为词法解析和语法解析。
先通过词法解析器将SQL拆分为一个个不可再分的单词。再使用语法解析器对SQL进行理解,并最终提炼出解析上下文。
Sharding-JDBC采用不同的解析器对SQL进行解析,解析器类型如下:
- MySql 解析器
- Oracle 解析器
- SQLServer 解析器
- PostgreSql 解析器
- 默认解析器 sql-92 标准,当没有找到对应的解析器时,将使用默认解析器
2.2 查询优化
对接收到的SQL语句,进行合并及分片条件优化。
2.3 SQL路由
根据解析上下文匹配用户配置的分片策略,并生成路由路径。目前支持分片路由(用于做了分片设置的表)和广播路由(用于全局表)。
2.4 SQL改写
将SQL改写为在物理数据库中可以正确执行的语句。SQL改写分为正确性改写和优化改写。
2.5 SQL执行
通过多线程执行器异步执行SQL,提高SQL执行效率。
2.6 结果归并
将多个执行结果集合并,以便于通过统一的JDBC接口输出。
结果归并包括流式归并、内存归并和使用装饰者模式的追加归并等方式。