一、前言
我们在上篇 Spring Boot集成ShardingSphere实现数据分片(一) | Spring Cloud 40 介绍了数据分片的背景及面临的挑战,本章我们结合实际业务场景来描述各数据分片类型的优缺点。
二、数据分片类型
在上篇中已知数据分片的拆分方式分为垂直分片和水平分片。而在实际的业务场景中可以分为:垂直分表、垂直分库、水平分表、水平分库。
ShardingSphere
支持的分片算法请见:https://shardingsphere.apache.org/document/current/cn/dev-manual/sharding/
2.1 垂直分表
2.1.1 基本概念
将一个表中的字段按照业务进行归类拆分成多个表,每个表存储其中一部分字段。
2.1.2 优点
-
拆分后业务清晰,拆分规则明确
-
系统之间整合或扩展容易
-
为了避免
IO
争抢并减少锁表的几率 -
充分发挥热门数据的操作效率,热门字段和冷门字段分开存储,比如一个人员基本信息表、一个人员详细信息表,大字段一定要放在冷门字段的表中
为什么大字段IO效率低?
- 数据本身长度过长,需要更长的读取时间;
- 跨页,页是数据库存储基本单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页存储数据少,因此IO效率低;
- 数据以行为单位将数据加载到内存中,如果字段长度短,内存就可以加载更多的数据,减少磁盘IO,从而提高数据库性能;
2.1.3 缺点
- 无法解决拆分后单表数据量过大问题
2.2 垂直分库
2.2.1 基本概念
垂直分表只解决了单一表数据量大的问题,并没有将表分布到不同的服务器上,因此每张表还是竞争同一台宿主机的CPU
、内存、网络IO
和磁盘。
垂直分库就是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库,它的核心理念是专库专用。
2.2.2 优点
- 拆分后业务清晰,拆分规则明确
- 系统之间整合或扩展容易
- 数据维护简单,能对不同业务的数据进行分级管理、维护、监控、扩展等
- 在高并发场景下,能适当提高业务的吞吐量,减少单机硬件资源瓶颈存在的影响
2.2.3 缺点
- 无法解决拆分后单表数据量过大问题
- 跨库业务表无法
JOIN
,只能通过接口方式解决,提高了系统复杂度 - 跨库事务处理复杂
- 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高
2.3 水平分表
2.3.1 基本概念
水平分表是通过某个字段(或某几个字段),根据某种规则将数据分散至多个表中,每个分片表仅存储数据的一部分。
2.3.2 优点
- 优化单一表数据量过大而产生的性能问题
- 避免
IO
争抢并减少锁表的几率
2.3.2 缺点
- 跨表
JOIN
/分页/排序性能低
2.3.4 常用水平分表的方式
-
Hash
取模分表数据库分表一般都是采用这种方式,比如一个order表,根据orderId%4,并按照结果分为4张表
- 优点
- 数据分片较为均匀,并容易出现热点和并发访问的瓶颈
- 缺点
- 容易产生跨分片查询的复杂问题
- 优点
-
数据Range分表
按照时间区间或字段的区间进行拆分
- 优点
- 单表大小可用
- 易于扩展
- 有效避免跨分片查询的问题
- 缺点
- 热点数据可能成为性能瓶颈
- 优点
2.4 水平分库
2.4.1 基本概念
水平分表只解决了单一表数据量大的问题,并没有将表分布到不同的服务器上,因此每张表还是竞争同一台宿主机的CPU
、内存、网络IO
和磁盘。
水平分库是把同一个表的数据按照一定规则拆分到不同的数据库中,从而将压力分散至不同的数据库。
2.4.2 优点
- 优化单一表数据量过大而产生的性能问题
- 避免
IO
争抢并减少锁表的几率
2.4.3 缺点
- 跨库
JOIN
/分页/排序性能低