MySQL分表分库基础
系列文章目录
- MySQL分表分库基础
- 分库分表-ShardingSphere基础
- 分库分表ShardingSphere-ShardingJDBC数据分片实战1
- 分库分表ShardingSphere-ShardingJDBC数据分片实战2
- 分库分表ShardingSphere-ShardingJDBC源码解析
文章目录
什么是分库分表
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
什么时候需要分库分表
《java开发手册》推荐:如果预计三年后的数据量达到单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
分表分库方式及其区别
分表分库方式包括:
- 客户端实现分表分库
- 服务端实现分表分库
客户端实现分表分库
框架
- ShardingSphere-JDBC
优缺点
- 优点:
- 轻量,范围更加容易界定,只是 JDBC 增强
- 性能高,JDBC 直连数据库,无需二次转发
- 缺点:不能够保证数据库的安全性、内存溢出,归并数据结果是没有解耦,有可能会影响我们业务逻辑
服务端实现分库
框架
- MyCat
- ShardingSphere-Proxy
优缺点
- 优点:
- 不与业务模块耦合
- 更有效的管理数据库的连接
- 缺点:效率比较低
垂直/水平分库分表
垂直/水平分库分表分为四种方式:垂直分库、水平分库、垂直分表、水平分表
垂直拆分
垂直分库
- 概念:垂直分库是指按照业务将表进行分类,分布到不同的数据库上
- 目的:
- 实现业务解耦,符合微服务思想
- 通过分库提升IO
垂直分表
- 概念:将一个表按照字段分成多表,每个表存储其中一部分字段
- 目的:
- 提升查询性能
- 冷热数据分开,避免IO争抢资源
- 原则:
- 大字段(Text,Blob字段)分表
- 少访问的数据分表
水平拆分
水平分库
- 概念:可以对同一张表数据实现拆分放到多个不同的数据库表中存放
- 目的:解决单一库数据量过大性能的问题
水平分表
- 概念:水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中
- 目的:解决单一表数据量过大性能的问题
分表分库策略
- 取余/取模:优点:均匀存放数据 缺点:扩容麻烦
- 按照范围分片:容易扩容,数据分布不均匀
- 按照日期进行分片:常用于订单等场景,容易将热点数据区分
- 按照枚举值分片
- 二进制取模范围分片
- 一致性hash分片:数据存放不均匀
- 按照目标字段前缀指定的进行分区
- 按照前缀ASCII码和值进行取模范围分片
分表分库缺点
- 事务一致性问题
数据存放在不同的库(可能存在不同服务器)可能带来分布式事务问题 - 跨节点关联查询问题
分库之后不能进行关联查询,只能查询多次之后进行合并,效率较低 - 跨节点分页、排序函数
需要在不同的节点进行分页以及排序之后,进行汇总,效率较低 - 主键重复问题
需要解决跨库主键重复问题,可用分布式主键生成解决 - 公共表处理
公共表(比如字典表)查询频繁,需要在每个库都保存一份,所有更新操作都同时发送到所有分库执行 - 运维工作量
分表分库之后,每次读写操作都需要知道实际SQL是在哪个表库执行,运维难度加大
作者:janyxe
来源链接:https://blog.csdn.net/janyxe/article/details/123334685