我们在日常的业务中最经常用到的,把数据进行水平分库,比如按照日期分库,按照奇偶性用户ID来水平分库,今天来说说如何使用 Sharding-JDBC 进行垂直切分表和数据库。

前情回顾之什么是垂直切分

什么是垂直切分,垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用,也就是说,我们需要把不同之间的业务进行分库,比如,支付业务我们可以创建一个库,而订单业务我们可以再用另外的一个库保存数据,说起来是简单,实现起来也并没有想象的那么难办。我们看看如何实现。

垂直分表

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

垂直分库

第一步
我们还是需要去创建数据库
垂直分库分表 - 图1
然后创建我们的指定的表

  1. DROP TABLE IF EXISTS users;
  2. CREATE TABLE users (
  3. id BIGINT(20) PRIMARY KEY,
  4. username VARCHAR(20) ,
  5. phone VARCHAR(11),
  6. STATUS VARCHAR(11) );

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

  1. spring:
  2. application:
  3. name: sharding-jdbc-simple
  4. http:
  5. encoding:
  6. enabled: true
  7. charset: UTF-8
  8. force: true
  9. main:
  10. allow-bean-definition-overriding: true
  11. #定义数据源
  12. shardingsphere:
  13. datasource:
  14. names: db1,db2,db3
  15. db1:
  16. type: com.alibaba.druid.pool.DruidDataSource
  17. driver-class-name: com.mysql.jdbc.Driver
  18. url: jdbc:mysql://localhost:3306/order?characterEncoding=UTF-8&useSSL=false
  19. username: root
  20. password: 123456
  21. db2:
  22. type: com.alibaba.druid.pool.DruidDataSource
  23. driver-class-name: com.mysql.jdbc.Driver
  24. url: jdbc:mysql://localhost:3306/ordersharding?characterEncoding=UTF-8&useSSL=false
  25. username: root
  26. password: 123456
  27. #配置user的数据源
  28. db3:
  29. type: com.alibaba.druid.pool.DruidDataSource
  30. driver-class-name: com.mysql.jdbc.Driver
  31. url: jdbc:mysql://localhost:3306/user?characterEncoding=UTF-8&useSSL=false
  32. username: root
  33. password: 123456
  34. ## 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1user_id为偶数操作db1数据源,否则操作db2
  35. sharding:
  36. tables:
  37. #配置db3的数据节点
  38. users:
  39. actual-data-nodes: db$->{3}.users
  40. table-strategy:
  41. inline:
  42. sharding- column: id
  43. algorithm-expression: users
  44. orderinfo:
  45. actual-data-nodes: db$->{1..2}.orderinfo
  46. key-generator:
  47. column: order_id
  48. type: SNOWFLAKE
  49. database-strategy:
  50. inline:
  51. sharding-column: user_id
  52. algorithm-expression: db$->{user_id % 2 + 1}
  53. props:
  54. sql:
  55. show: true
  56. server:
  57. servlet:
  58. context-path: /sharding-jdbc
  59. mybatis:
  60. configuration:
  61. map-underscore-to-camel-case: true

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

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = RunBoot.class)
  3. public class UsersDaoTest {
  4. @Autowired
  5. UsersDao usersDao;
  6. @Test
  7. public void testInsert(){
  8. for (int i = 0; i < 10; i++) {
  9. Long id = i+100L;
  10. usersDao.insertUser(id,"大佬"+i, "17458236963","1");
  11. }
  12. }
  13. }
  14. /**
  15. * 新增用户
  16. * */
  17. @Insert("insert into users(id,username,phone,status) values(#{id},#{username},#{phone},#{status})")
  18. int insertUser(@Param("id") Long id, @Param("username") String username, @Param("phone") String phone,@Param("status") String status);

垂直分库分表 - 图2
看着截图的样子,阿粉感觉是没啥问题,我们再去数据库验证一下。
垂直分库分表 - 图3
也确定了数据保存进去了,这就是垂直分库
俺么我们什么时候垂直分库呢?答案是根据业务逻辑进行分割。比如我们可以把用户表和用户相关的表分配到用户数据库中,而把商品表和商品相关的数据分配到商品数据库中。
阿粉觉得这种垂直分库分表,实际上就是通过不同的数据源来进行操作的,而通过给mybatis的mapper配置不同的数据源也是能实现的,但是还是看个人选择吧。
大家学会如何使用 Sharding-JDBC 进行分库分表了么?
《Sharding系列》
数据库的分库分表是什么?
SpringBoot整合Sharding实现水平分表
SrpingBoot整合Sharding实现水平分库