1. 程式人生 > 其它 >mysql--使用shardingsphere實現分表

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. 測試結果

插入效果:

查詢效果:

本文來自部落格園,作者:EchoLv,轉載請註明原文連結:https://www.cnblogs.com/lvdeyinBlog/p/15040145.html