- 为什么要分库分表
随着业务扩大,系统访问量增大,数据表数据增大,导致数据库性能出现瓶颈
- 如何分库分表
水平分库分表,垂直分库分表
垂直分表:将一张表按照字段划分为多张表
垂直分库:按照业务,让不同业务的表放在不同的数据库中
垂直:针对的是数据表结构进行切分
水平分表:在同一个数据库中,将一张表水平切分为多长表
水平分库:将一张表切分成多张表到不同的数据库中
水平:针对的是数据行进行的切分
- 常用的分库分表中间件
Sharding-jdbc(原则上不能称做中间件,它是以jar包的形式存在的),mycat
- 垂直分表的作用
减少IO带来的性能损耗
减少IO锁表的可能
让每页存储更多的行数据
垂直分表的原则: 让热门数据字段单独分一张表,让大字段不经常查询的到另外一张表
- 垂直分库的作用
垂直分表只解决了单一表数据量过大的问题,但没将表分到不同的数据库中,因此每个表还是竞争同一个物理机的CPU,内存,网络IO,磁盘
垂直分库的原则:按照业务,让数据库中的表分到不同的数据库中,专库专用
- 水平分库的作用
解决单表数据量大访问频繁的问题。前面垂直分库分表的策略已经不能解决当前的问题时,需要使用到水平分
水平分库的原则:根据原始表的某个业务ID,对ID%库的数量,让不同的数据进入到水平切分后不同的库中对应的表中。每个库的表结构是一样的
- 水平分表的作用
解决单表数据量过大的问题
水平分表的原则:在同一个数据库内,将一张表水平拆分为多张表,表的数据结构不变
- 分库分表设计的最佳实践原则
- 分库分表需要解决的问题
1.事务一致性问题
分布式事务
跨结点关联查询
跨结点分页、排序
主键避重
无法使用自增主键
公共表(多个表需要用到的表,如区域表)
Sharding-jdbc的功能
功能:
数据分片
读写分离
Sharding-jdbc分表规则配置
步骤:
- 配置数据源
- 配置数据表的数据节点
t_order是逻辑表,sharding_jdbc会根据设置的分片策略,将对逻辑表操作的sql映射生成在不同的数据表的sql并执行
- 配置主键生成策略
- 配置分表策略:分片键和分片算法
Where后的条件如果出现order_id,会根据这个order_id并通过分片算法到对应的数据表中获取数据
- 打开sql日志
- Sharding-jdbc的配置方法
- Properties
- Yml
- @Configuration
- Xml
- Sharding-jdbc的几个概念
- 逻辑表
用户定义的sql操作的表
- 真实表
Sharding-jdbc根据分片策略真正执行sql操作的表
- 数据节点
某一张真实表表示一个节点
- 绑定表
指分片策略一致的主表和子表,例如:商品表和商品明细表。此时商品表和商品明细表之间的关联查询对于sharding-jdbc来说不会出现笛卡尔积关联查询的问题。因为如果是绑定表的话,它们对于同一个业务ID的数据肯定是落在各自对应的同一个真实表中
- 广播表
指的是公共表,对于不同数据源中都会用到的表,那么sharding-jdbc在操作这个表的时候,会对所有数据源的这个表执行sql
- 分片键(分片字段)
- 分片算法
- 分片策略
分片键+分片算法
-
自增主键生成策略
- Sharding-jdbc的执行原理
Sql解析->sql路由->sql改写->sql执行->结果合并
- sql解析
目的:标记语法树上的哪些结点可能会被改写
分为词法解析和语法解析
词法解析:解析sql中的关键字
语法解析:将词法解析的结果和sql生成语法树
分为蓝色ROOT,绿色:关键字,红色:变量,白色:还可以再分子结点的结点
- sql路由
目的:把逻辑表的数据操作映射为对数据结点操作的过程
根据分片键操作类型分类:
1.单片路由:=
2.多片路由:in
3.范围路由:between
4.广播路由:不携带分片键
根据分片键进行路由的场景分类:
直接路由
标准路由
笛卡尔路由
全库表路由:广播路由
sql改写
目的1:将对逻辑表操作的sql,改写为对真实表操作的sql
目的2:对于Group By,order By操作,在进行结果归并的时候,如果sql查询的字段不包含 分组或排序的字段,那么在改写后会将 原sql查询的字段增加上 分组或排序的字段。为什么这么做呢?因为如果没有补充的话,两张表的数据进行结果归并没办法进行分组或排序,因为缺少排序列
- Sql执行
目的:负责将路由和改写后的sql发送到底层数据库去执行
特点:自动化的平衡数据库连接资源与执行效率。它会在 内存限制模式和 连接限制模式之间进行自适应的切换
OLAP:面向分析的系统
OLTP:面向事务的操作
- 结果归并
目的:查询遍历,分组,排序,聚合的结果进行归并
归并的分类:
内存归并
流式归并
通过游标实现。先让每张表查询的数据有序,再通过每张表的游标进行移动来排序
- 装饰者归并
在以前归并后的结果的基础上做进一步增强,使用到了装饰者模式
- Sharding-jdbc的执行原理总结
Sharding-jdbc水平分库配置规则
配置多个数据源
- 配置分库策略:分库键和分库算法
分片策略:inline
- 配置数据节点
- Sharding-jdbc的优化
查询的时候尽量使用到分片键,避免广播路由产生额外的sql查询
Sharding-jdbc垂直分库配置规则
配置数据源
-
配置数据节点
-
配置分表策略
Sharding-jdbc公共表
配置公共表
Sharding-jdbc读写分离
修改mysql的配置文件
配置从库数据源
- 配置主库从库逻辑数据源
-
配置主库从库数据节点