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

插入效果:

 

 

 

 查詢效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM