Sharding——JDBC
它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
对比图:
开发人员只需正常写查询、mapper即可、无感知。
分库分表概念
随着业务的不断增长,数据也飞速增长,访问也随之变慢,添加从库、新建索引等很多操作仍严重下降,分库分表需求迫在眉睫。
方案一:
通过提升服务性能来提升数据处理能力,例如:扩容、CPU等,但成本很高。
方案二:
把数据分散在不同数据集中,大表拆成小表、数据落盘到不同库中,从而使得数据集变小从而提升性能。
- 垂直分库
以表
为依据,按照业务需求将表
拆到不同库中。
每个库
的结构不一样。
每个库
的数据不一样,没有交集。
所有库的并集
是全量数据。
场景:
这一步拆分基本是服务化,例如,中间表、字典表、配置表等越来越多,可以将这些表拆分到单独库中,甚至可以微服务化。
- 垂直分表
以字段
为依据,按照字段活跃性拆到不同表
中。
每张表结构
不一样。
每张表数据也
不一样,至少有一列交集
用于关联。
所有表并集
数据是全量数据。
场景:
用户表中有id、名称、住址等信息,每次查询用户信息时住址字段使次数很低,大字段等单独拆分一张,从而减少IO提升性能。
- 水平分库
以字段
为依据,按照一定策略(hash、range等),将一个库
中的数据拆分到多个库
中。
每个库结构
都一样。
每个库数据
都不一样,没有交集。
所有库并集
是全量数据。
场景:
库多了,IO和CPU压力可以成倍缓解。
- 水平分表
以字段
为依据,按照一定策略(hash、range等),将一个表
中的数据拆分到多个表
中。
每张表结构
都一样。
每张表数据
都不一样,没有交集。
所有表并集
是全量数据。
场景:
表的数据量少了,SQL执行效率高,IO和CPU压力可以成倍缓解。
POM文件
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<