一. 简介
为什么要分表,无非就两个原因,要么是并发太高,要么就是数据量太大。
所谓分表就是把传统的单表扩展为多个数据结构一样的表,通过分表策略确定操作哪一张表。
我使用的分表规则是通过主键id进行取模运算。
例如user表,假设分三个表:user_0 user_1 user_2
插入操作:
假设添加一个用户主键id为1 1%3 = 1
该用户将会插入到user_1表中
查询操作:
查询操作时shardingsphere会将个个表中的id进行排序后返回
手把手在springboot中通过shardingsphere实现mysql的分表操作。
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。
它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。
它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。
该文章中我们主要对Sharding-JDBC做简单的使用,更多更深入的内容铁子们可以自行去深入了解。
二. 编码阶段
1. 依赖引入(主要依赖)
1 <dependency> 2 <groupId>org.mybatis.spring.boot</groupId> 3 <artifactId>mybatis-spring-boot-starter</artifactId> 4 <version>2.2.0</version> 5 </dependency> 6 <!--druid数据源--> 7 <dependency> 8 <groupId>com.alibaba</groupId> 9 <artifactId>druid-spring-boot-starter</artifactId> 10 <version>1.2.1</version> 11 </dependency> 12 <!--shardingsphere--> 13 <dependency> 14 <groupId>org.apache.shardingsphere</groupId> 15 <artifactId>sharding-jdbc-spring-boot-starter</artifactId> 16 <version>4.0.0-RC1</version> 17 </dependency> 18 <dependency> 19 <groupId>org.apache.shardingsphere</groupId> 20 <artifactId>sharding-jdbc-spring-namespace</artifactId> 21 <version>4.0.0-RC1</version> 22 </dependency> 23 <!--jdbc--> 24 <dependency> 25 <groupId>mysql</groupId> 26 <artifactId>mysql-connector-java</artifactId> 27 <version>8.0.22</version> 28 </dependency>
2. 修改配置文件
1 #mybatis信息 2 mybatis: 3 mapper-locations: classpath:mapping/*Mapper.xml 4 type-aliases-package: com.example.demo.entity 5 6 Spring: 7 shardingsphere: 8 datasource: 9 names: master #配置数据源 10 master: 11 type: com.alibaba.druid.pool.DruidDataSource 12 driver-class-name: com.mysql.cj.jdbc.Driver 13 url: jdbc:mysql://127.0.0.1:3306/test_1?serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true 14 username: lv1 15 password: 123456 16 #配置分表规则 17 sharding: 18 #指定所需分的表 19 tables: 20 #表user_ 21 user_: 22 actual-data-nodes: master.user_$->{0..2} #需要分表的表 user_0 user_1 user_2 23 table-strategy: 24 inline: 25 sharding-column: id #主键 26 algorithm-expression: user_$->{id % 3} #分表规则 27 #表order_ 28 order_: 29 actual-data-nodes: master.order_$->{0..2} #需要分表的表 30 table-strategy: 31 inline: 32 sharding-column: id #主键 33 algorithm-expression: order_$->{id % 3} #分表规则 34 props: 35 sql: 36 show: true
3. 测试
@RestController @RequestMapping("/user") @Api(tags = "用户相关") public class UserController { @Autowired private UserService userService; @PostMapping(value = "/create") @ApiOperation(value = "创建用户") public Object create(){ List<User> users = new ArrayList<>(); User user1 = new User(1, "Echo", 1, 18, "贵阳"); User user2 = new User(2, "Echo", 1, 18, "贵阳"); User user3 = new User(3, "Echo", 1, 18, "贵阳"); User user4 = new User(4, "Echo", 1, 18, "贵阳"); User user5 = new User(5, "Echo", 1, 18, "贵阳"); User user6 = new User(6, "Echo", 1, 18, "贵阳"); users.add(user1); users.add(user2); users.add(user3); users.add(user4); users.add(user5); users.add(user6); return userService.insertForeach(users); } @GetMapping(value = "get") @ApiOperation(value = "获取用户信息") private Object list(){ return userService.list(); } }
4. 测试结果
插入效果:
查询效果: