sharding-jdbc分库分表入门知识点

  1. 为什么要分库分表

随着业务扩大,系统访问量增大,数据表数据增大,导致数据库性能出现瓶颈

  1. 如何分库分表

水平分库分表,垂直分库分表

垂直分表:将一张表按照字段划分为多张表

垂直分库:按照业务,让不同业务的表放在不同的数据库中

垂直:针对的是数据表结构进行切分

水平分表:在同一个数据库中,将一张表水平切分为多长表

水平分库:将一张表切分成多张表到不同的数据库中

水平:针对的是数据行进行的切分

  1. 常用的分库分表中间件

Sharding-jdbc(原则上不能称做中间件,它是以jar包的形式存在的),mycat

  1. 垂直分表的作用

减少IO带来的性能损耗

减少IO锁表的可能

让每页存储更多的行数据


sharding-jdbc分库分表入门知识点_第1张图片

垂直分表的原则: 让热门数据字段单独分一张表,让大字段不经常查询的到另外一张表

  1. 垂直分库的作用

垂直分表只解决了单一表数据量过大的问题,但没将表分到不同的数据库中,因此每个表还是竞争同一个物理机的CPU,内存,网络IO,磁盘

垂直分库的原则:按照业务,让数据库中的表分到不同的数据库中,专库专用

sharding-jdbc分库分表入门知识点_第2张图片
  1. 水平分库的作用

解决单表数据量大访问频繁的问题。前面垂直分库分表的策略已经不能解决当前的问题时,需要使用到水平分

水平分库的原则:根据原始表的某个业务ID,对ID%库的数量,让不同的数据进入到水平切分后不同的库中对应的表中。每个库的表结构是一样的

  1. 水平分表的作用

解决单表数据量过大的问题

sharding-jdbc分库分表入门知识点_第3张图片

水平分表的原则:在同一个数据库内,将一张表水平拆分为多张表,表的数据结构不变

  1. 分库分表设计的最佳实践原则
  1. 分库分表需要解决的问题

1.事务一致性问题

分布式事务

  1. 跨结点关联查询

  2. 跨结点分页、排序

  3. 主键避重

无法使用自增主键

  1. 公共表(多个表需要用到的表,如区域表)

  2. Sharding-jdbc的功能

功能:

  1. 数据分片

  2. 读写分离

  3. Sharding-jdbc分表规则配置

步骤:

  1. 配置数据源
sharding-jdbc分库分表入门知识点_第4张图片
  1. 配置数据表的数据节点

t_order是逻辑表,sharding_jdbc会根据设置的分片策略,将对逻辑表操作的sql映射生成在不同的数据表的sql并执行

  1. 配置主键生成策略
  1. 配置分表策略:分片键和分片算法

Where后的条件如果出现order_id,会根据这个order_id并通过分片算法到对应的数据表中获取数据

  1. 打开sql日志
  1. Sharding-jdbc的配置方法
  • Properties
  • Yml
  • @Configuration
  • Xml
  1. Sharding-jdbc的几个概念
  • 逻辑表

用户定义的sql操作的表

  • 真实表

Sharding-jdbc根据分片策略真正执行sql操作的表

  • 数据节点

某一张真实表表示一个节点

  • 绑定表

指分片策略一致的主表和子表,例如:商品表和商品明细表。此时商品表和商品明细表之间的关联查询对于sharding-jdbc来说不会出现笛卡尔积关联查询的问题。因为如果是绑定表的话,它们对于同一个业务ID的数据肯定是落在各自对应的同一个真实表中

  • 广播表

指的是公共表,对于不同数据源中都会用到的表,那么sharding-jdbc在操作这个表的时候,会对所有数据源的这个表执行sql

  • 分片键(分片字段)
  • 分片算法
  • 分片策略

分片键+分片算法

  • 自增主键生成策略


  1. Sharding-jdbc的执行原理

Sql解析->sql路由->sql改写->sql执行->结果合并

  1. sql解析

目的:标记语法树上的哪些结点可能会被改写

分为词法解析和语法解析

词法解析:解析sql中的关键字

语法解析:将词法解析的结果和sql生成语法树

分为蓝色ROOT,绿色:关键字,红色:变量,白色:还可以再分子结点的结点

  1. sql路由

目的:把逻辑表的数据操作映射为对数据结点操作的过程

根据分片键操作类型分类:

1.单片路由:=

2.多片路由:in

3.范围路由:between

4.广播路由:不携带分片键

根据分片键进行路由的场景分类:

  1. 直接路由

  2. 标准路由

  3. 笛卡尔路由

  4. 全库表路由:广播路由

  5. sql改写

目的1:将对逻辑表操作的sql,改写为对真实表操作的sql

目的2:对于Group By,order By操作,在进行结果归并的时候,如果sql查询的字段不包含 分组或排序的字段,那么在改写后会将 原sql查询的字段增加上 分组或排序的字段。为什么这么做呢?因为如果没有补充的话,两张表的数据进行结果归并没办法进行分组或排序,因为缺少排序列

  1. Sql执行

目的:负责将路由和改写后的sql发送到底层数据库去执行

特点:自动化的平衡数据库连接资源与执行效率。它会在 内存限制模式和 连接限制模式之间进行自适应的切换

sharding-jdbc分库分表入门知识点_第5张图片

OLAP:面向分析的系统

OLTP:面向事务的操作

  1. 结果归并

目的:查询遍历,分组,排序,聚合的结果进行归并

归并的分类:

  1. 内存归并

  2. 流式归并

通过游标实现。先让每张表查询的数据有序,再通过每张表的游标进行移动来排序

  1. 装饰者归并

在以前归并后的结果的基础上做进一步增强,使用到了装饰者模式

  1. Sharding-jdbc的执行原理总结
sharding-jdbc分库分表入门知识点_第6张图片
  1. Sharding-jdbc水平分库配置规则

  2. 配置多个数据源

sharding-jdbc分库分表入门知识点_第7张图片
  1. 配置分库策略:分库键和分库算法

分片策略:inline

  1. 配置数据节点
  1. Sharding-jdbc的优化

查询的时候尽量使用到分片键,避免广播路由产生额外的sql查询

  1. Sharding-jdbc垂直分库配置规则

  2. 配置数据源

sharding-jdbc分库分表入门知识点_第8张图片
  1. 配置数据节点


  2. 配置分表策略


  3. Sharding-jdbc公共表

  4. 配置公共表

  1. Sharding-jdbc读写分离

  2. 修改mysql的配置文件

  3. 配置从库数据源

sharding-jdbc分库分表入门知识点_第9张图片
  1. 配置主库从库逻辑数据源
  1. 配置主库从库数据节点



你可能感兴趣的:(sharding-jdbc分库分表入门知识点)