mysql--使用shardingsphere实现分表

一. 简介

为什么要分表,无非就两个原因,要么是并发太高,要么就是数据量太大。

所谓分表就是把传统的单表扩展为多个数据结构一样的表,通过分表策略确定操作哪一张表。

我使用的分表规则是通过主键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做简单的使用,更多更深入的内容铁子们可以自行去深入了解。

二. 编码阶段

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. 测试结果

插入效果:

 

 

 

 查询效果:

posted @ 2021-07-21 16:33  EchoLv  阅读(415)  评论(0编辑  收藏  举报