网络知识 娱乐 Sharding垂直分库分表

Sharding垂直分库分表

垂直分表

垂直分表就是将一个表细分,且在同一个库里,正常操作即可。

这种相对来说就压根没必要用sharding-sphere,数据一部分在一个表,和数据存储在另外一个表,那就意味着,这就是两个表存了不同的数据,比如商品服务,我们把商品基本信息放在一张表,商品详情放在一张表,这就相当于是垂直分表了,但是看起来总是这么的奇怪,奇怪归奇怪,他还就是这样的。而垂直分库就不是这样的了。我们来看看如何实现。

垂直分库

第一步

我们还是需要去创建数据库的

Sharding垂直分库分表

然后创建我们的指定的表

DROP TABLE IF EXISTS users; nCREATE TABLE users ( nid BIGINT(20) PRIMARY KEY, nusername VARCHAR(20) ,nphone VARCHAR(11),nSTATUS VARCHAR(11) );n

第二步

接下来我们就要和之前一样了,开始配置我们的配置数据。

spring:n application:n name: sharding-jdbc-simplen http:n encoding:n enabled: truen charset: UTF-8n force: truen main:n allow-bean-definition-overriding: truenn #定义数据源n shardingsphere:n datasource:n names: db1,db2,db3n db1:n type: com.alibaba.druid.pool.DruidDataSourcen driver-class-name: com.mysql.jdbc.Drivern url: jdbc:mysql://localhost:3306/order?characterEncoding=UTF-8&useSSL=falsen username: rootn password: 123456n db2:n type: com.alibaba.druid.pool.DruidDataSourcen driver-class-name: com.mysql.jdbc.Drivern url: jdbc:mysql://localhost:3306/ordersharding?characterEncoding=UTF-8&useSSL=falsen username: rootn password: 123456n #配置user的数据源n db3:n type: com.alibaba.druid.pool.DruidDataSourcen driver-class-name: com.mysql.jdbc.Drivern url: jdbc:mysql://localhost:3306/user?characterEncoding=UTF-8&useSSL=falsen username: rootn password: 123456n ## 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作db1数据源,否则操作db2。n sharding:n tables:n #配置db3的数据节点n users:n actual-data-nodes: db$->{3}.usersn table-strategy:n inline:n sharding- column: idn algorithm-expression: usersn orderinfo:n actual-data-nodes: db$->{1..2}.orderinfon key-generator:n column: order_idn type: SNOWFLAKEn database-strategy:n inline:n sharding-column: user_idn algorithm-expression: db$->{user_id % 2 + 1}n props:n sql:n show: truenserver:n servlet:n context-path: /sharding-jdbcnmybatis:n configuration:n map-underscore-to-camel-case: truenn

接下来就是去写一组插入语句,然后我们把数据插入到数据库测试一下。

@RunWith(SpringRunner.class)n@SpringBootTest(classes = RunBoot.class)npublic class UsersDaoTest {nn @Autowiredn UsersDao usersDao;nn @Testn public void testInsert(){nn for (int i = 0; i < 10; i++) {n Long id = i+100L;n usersDao.insertUser(id,"大佬"+i, "17458236963","1");n }n }n }n

/**n * 新增用户n * */n @Insert("insert into users(id,username,phone,status) values(#{id},#{username},#{phone},#{status})")n int insertUser(@Param("id") Long id, @Param("username") String username, @Param("phone") String phone,@Param("status") String status);nSharding垂直分库分表

看着截图的样子,阿粉感觉是没啥问题,我们再去数据库验证一下。

Sharding垂直分库分表

也确定了数据保存进去了,这就是垂直分库

那么我们什么时候垂直分库呢?答案是根据业务逻辑进行分割。比如我们可以把用户表和用户相关的表分配到用户数据库中,而把商品表和商品相关的数据分配到商品数据库中。

阿粉觉得这种垂直分库分表,实际上就是通过不同的数据源来进行操作的,而通过给mybatis的mapper配置不同的数据源也是能实现的,但是还是看个人选择吧。

大家学会如何使用 Sharding-JDBC 进行分库分表了么?

《Sharding系列》

数据库的分库分表是什么?

SpringBoot整合Sharding实现水平分表

SrpingBoot整合Sharding实现水平分库