将一个表按照字段分成多表,每个表存储一部分字段,也即一表拆多表,按照特定字段。
将原来关联紧密的数据库进行解耦,一库多表->多库多表,按照不同的表。
一库一表->一库多表
采用取模的方式将满足条件的方式存储到不同的库中,比如单双数据库将数据存储到不同库中,一库一表->多库一表
水平拆分的数据表的总称,如订单表:t_order_0、t_order_1...中的t_order
在分片数据库中真实的表,如t_order_0、t_order_1等
数据分配的最小物理单元,由数据源和数据表组成,如ds_0.t_order_1
分片规则一致的主表和子表,如t_order表和t_order_item表都是以order_id进行分片,绑定表之间的分区键完全相同,则此两张表互为绑定表关系。绑定表之间多表关联查询不会出现笛卡尔积,查询效率会大大提升。绑定关系后,路由sql将会减少,提升效率。
所有分片数据源都存在的表,表结构和表数据在每个数据库均一致。适用于数据量不大但和海量数据表关联的场景。
用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。如果sql中无分片键,则路由效果差,也即此时查询的语句是多种,此时查询效率不是很好。
支持equal、in、between
包括分片键和分片算法,真正可用于分片操作的是 分片键 + 分片算法 ,常用的分片策略:使用groovy表达式:如t_order_$->{u_id%8}表示订单表按照u_id取模分为8张表
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。
如官方图所示:
过程可以总结为:
当sharding-jbdc接收到一条sql语句的时候,会陆续执行:
sql解析
查询优化
sql路由
sql改写
sql执行
结果归并
返回执行结果
sql解析分为:
SQL解析过程分为词法解析和语法解析。语法解析器用于将sql拆解为不可再分的原子符号,称为token.并根据不同的数据库方言所提供的字典,将其归类为关键字、表达式、字面量、操作符。再使用语法解析器将sql转换为抽象语法树。
把针对逻辑表的数据操作映射到对数据节点的操作过程
不携带分配键的为广播表
直接路由
标准路由:推荐的分片方式,使用范围不包括关联查询 或 仅包含绑定表之间关联查询的sql.当时=号落入单库中,如果between或者in时,结果不一定落入唯一库中
笛卡尔路由:所有结果的排列组合 性能较差
广播路由:不带分片键,分为全库表路由、全库路由、全实例路由、单库路由、阻断路由
全库路由:用于处理数据库中与其逻辑表相关的所有真实表的操作,主要包括:不带分片键的DQL、DML、DDL
用于将逻辑sql改写为在真实数据库中可以正确执行的sql
sharding-jdbc采用一套自动化的执行引擎,负责将路由和改写完成的真实sql安全且高效的发送到底层数据源执行。它能在以下两种模式下自适应切换:
内存限制模式:使用前提是sharding-jdbc对一次操作所耗费的数据库连接数不做限制,使用于OLAP
连接限制模式:使用前提是严格控制对一次操作所消耗的数据库连接数量,适用于OLTP,OLTP带分片键
遍历
排序
分组
分页
聚合