sharding-jdbc梳理(一)

一、首先说下分库分表概念:
1、垂直分表:举个例子商品列表,一张商品表分为商品基础信息表以及详情表,大部分浏览是基础表并且调用频率高,而详情表相对较低,所以垂直分表,将商品分为基础表以及详情表,这样既能减少传输数据量降低IO,并且减少锁表概率,为什么这么说呢,因为修改详情不会锁定基础信息完全独立的。
2、垂直分库:还是商城项目,把商品一个库,店铺一个库这样分开,对应到分布式开发上就是不同业务模块。
3、水平分库:随着商品越来越多我们开始水平分库,并且也可以将不同的库部署到不同的服务器上来提高性能。但是也伴随着一些问题比如分布在不同服务器带来的分布式事务问题、跨节点关联查询、跨节点分页、排序问题,还有主键避重问题。
4、水平分表:将同一个库里面的表按照一定规则水平拆分
一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。
shardingjdbc与jdbc性能对比:
单表时候查询、更新、插入损耗不超过7%,但是如果双库性能提升大概2倍左右,毕竟shardingjdbc是应用在分库分表场景。
二、sharding入门基础知识
逻辑表:水平拆分的数据表的总称,例:订单数据表根据主键尾数拆分为10张表,分别是t_order_0 、t_order_1 到t_order_9 ,他们的逻辑表名为t_order 。
真实表:在分片的数据库中真实存在的物理表。即上个示例中的t_order_0 到t_order_9 。
数据节点:数据分片的最小物理单元。由数据源名称和数据表组成,例: ds_0.t_order_0 。
绑定表:指分片规则一致的主表和子表。例如: t_order 表和t_order_item 表,均按照order_id 分片,绑定表之间的分区键完全相同,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大
大提升。
广播表:指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。
分片键:用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,Sharding-
Jdbc也支持根据多个字段进行分片。
分片算法:通过分片算法将数据分片,支持通过= 、BETWEEN 和IN 分片。
分片策略:包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。
自增主键生成策略:通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。
当Sharding-JDBC接受到一条SQL语句时,会陆续执行SQL解析 => 查询优化 => SQL路由 => SQL改写 => SQL执行 =>结果归并,最终返回执行结果。
0、SQL解析过程分为词法解析和语法解析。 词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。
1、sql路由的时候对于携带分片键的sql进行路由进行路由(单片、多片in、范围路由between),如果不携带分片键则广播路由。并且路由分为直接路由、标准路由、笛卡尔路由,标准路由也是最推荐的,它的适用范围是不包含关联查询或仅包含绑定表之间关联查询的SQL。笛卡尔路由:笛卡尔路由是最复杂的情况,它无法根据绑定表的关系定位分片规则,因此非绑定表之间的关联查询需要拆解为笛卡尔积组合执行。全库表路由:也叫广播路由,对于不携带分片键的SQL,则采取广播路由的方式。
2、sql改写:将逻辑sql经过解析路由后改写成真正执行的真实sql
3、sql执行:执行的时候有两种模式,为什么会出现两种模式,因为sql改写后很可能分为多个真实sql,这时候那shardingjdbc可以采用多线程执行真实sql,但这个也不是无限制的,内存限制模式,主要是sql效率最大化,OLAP,连接限制模式,主要是OLTP模式。OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。
4、结果归并:一般的groupby、orderby、sort等操作都会产生结果归并问题,shardingjdbc一般采用内存归并、流式归并、装饰者归并。内存归并:他是将所有分片结果集的数据都遍历并存储在内存中,再通过统一的分组、排序以及聚合等。流式归并:每一次从数据库结果集中获取到的数据,都能够通过游标逐条获取的方式返回正确的单条数据,它与数据库原生的返回结果集的方式最为契合。流式归并采用了游标的概念,这里讲讲这个是怎么玩的,游标概念就是在查询的时候比如定位到3个表,然后前10个返回,在定位查询到每一张表的时候就首先会对每个查询结果降序排序,然后给每个最上面的定义一个游标,当我们取的时候只取游标指定的值比较,取出一个最大值,然后这个值的游标向下移动,再取值再比较三个数这时候可能是其他表的值大那就同样的原理将那个大的值取出然后游标下移就这样一个个取出合适的数值。装饰者归并:比如求sum聚合,就是把每个都sum然后再总的sum,就是在以前基础上增强所以叫做装饰者归并。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值