Sharding JDBC
https://shardingsphere.apache.org/index_zh.html
4.x开始apache孵化
Sharding JDBC 不是做分库分表的,它是用来去操作已经分库分表好的数据
- 主要功能
- 数据分片
- 读写分离
数据分片
概念
https://shardingsphere.apache.org/document/current/cn/features/sharding/concept/
数据库与表
db0
├── t_order_0
├── t_order_1
├── t_order_item_0
├── t_order_item_1
└── config
db1
├── t_order_0
├── t_order_1
├── t_order_item_0
├── t_order_item_1
└── config
-
逻辑表与真实表
把一个水平拆分的逻辑表
t_order,拆分为真实表
t_order_0到t_order_9。 -
数据节点
t_order_0的数据节点
为 db0.t_order_0。
t_order整体的数据节点配置为: db0.t_order_0, db0.t_order_1, db1.t_order_0, db1.t_order_1 -
绑定表
如 t_order表和t_order_item表里 order_id字段存在对应关系,均按照order_id分片可以使对应的列会在相近的真实表,则此两张表互为绑定表
关系
即:
t_order_0里关联的数据都在t_order_item_0 里
t_order_1里关联的数据都在t_order_item_1 里 -
广播表
广播表
表结构和表中的数据在每个分片数据库中均完全一致
db0.config 完全等于 db1.config
分片键
用于分片的数据库字段
- SQL 中如果无分片字段,则无法进行分片,将全路由执行,性能较差
- 当分片键处于运算表达式中时,无法通过 SQL 字面提取用于分片的值,将导致全路由。
- 不能将原生自增主键同时作为分片键使用。
分片算法
单分片键 或 多分片键 通过 =、IN、 BETWEEN 进行分片
分片算法灵活度非常高。
- 可由开发者自行实现,
- 也可使用 Apache ShardingSphere 内置的分片算法语法糖( 包括取模、哈希、范围、时间等常用分片算法的实现),
强制分片路由
分片字段并非由 SQL 而是其他外置条件决定的场景,在 Apache ShardingSphere 中叫做 Hint。
Hint行分片 进行分片
分片策略
分片策略:分片键和分片算法 的组合
1.2.3.是解析SQL里的分片字段来分片
4.是非SQL决定,而由其他外置条件决定的场景
-
标准分片策略 (StandardShardingStrategy)
单分片键 + 精确分片算法【必选】 + 范围分片算法【可选】
作用: 对SQL语句中 单分片键的 =, IN和BETWEEN AND的分片操作 -
复合分片策略 (ComplexShardingStrategy)
多分片键 + 开发者实现算法 (直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现)
作用: 对SQL语句中 多分片键的 =, IN和BETWEEN AND的分片操作 -
行表达式分片策略 (InlineShardingStrategy)
Groovy表达式配置的 单分片键 + 精确分片算法
作用: 用Groovy的表达式 对SQL语句中 单分片键的 =和IN的分片操作。避免繁琐的Java代码开发 -
Hint分片策略 (HintShardingStrategy)
通过Hint而非SQL解析的方式分片的策略。 -
不分片策略 (NoneShardingStrategy)
行表达式
通过行表达式可以有效的简化数据节点配置
在配置中使用${ expression }
或$->{ expression }
标识行表达式即可
支持数据节点和分片算法这两个部分的配置。行表达式的内容使用的是Groovy的语法
springBoot 使用
https://github.com/xu1211/mysql-jsonNotes/tree/shardingJdbc