一. 簡介
為什么要分表,無非就兩個原因,要么是並發太高,要么就是數據量太大。
所謂分表就是把傳統的單表擴展為多個數據結構一樣的表,通過分表策略確定操作哪一張表。
我使用的分表規則是通過主鍵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. 測試結果
插入效果:
查詢效果: