ShardingSphere水平分表策略配置和测试实战

打印 上一主题 下一主题

主题 709|帖子 709|积分 2127


  • 概念

    • 水平分表

      • 把一个表的数据分到一个数据库的多张表中,每个表只有这个表的部分数据
      • 核心是把一个大表,分割N个小表,每个表的结构是一样的,数据不一样,全部表的数据合起来就是全部数据
      • 针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去
      • 但是这些表还是在同一个库中,所以单数据库操作还是有IO瓶颈,主要是解决单表数据量过大的问题
      • 减少锁表时间,没分表前,如果是DDL(create/alter/add等)语句,当需要添加一列的时候mysql会锁表,期间所有的读写操作只能等待

    • 水平分表的适用场景

      • 当一张表的数据达到几千万时,查询一次所花的时间长,需要进行优化,缩短查询时间

        • 微博发送记录、微信消息记录、日志记录。以id增长或时间划分
        • 网站签到等活动流水数据。以时间划分



实战样板

<ul>依赖引入
  1.     <dependency>
  2.         <groupId>org.apache.shardingsphere</groupId>
  3.         <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4.         <version>4.1.1</version>
  5.     </dependency>
复制代码
application
  1. # 数据源 ds0 第一个数据库  --- 版本:mysql8
  2.   shardingsphere:
  3.     datasource:
  4.       ds0:
  5.         connectionTimeoutMilliseconds: 30000
  6.         driver-class-name: com.mysql.cj.jdbc.Driver
  7.         idleTimeoutMilliseconds: 60000
  8.         jdbc-url: jdbc:mysql://[ip]:3306/[数据库]?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  9.         maintenanceIntervalMilliseconds: 30000
  10.         maxLifetimeMilliseconds: 1800000
  11.         maxPoolSize: 50
  12.         minPoolSize: 50
  13.         password: [密码]
  14.         type: com.zaxxer.hikari.HikariDataSource
  15.         username: [用户名]
  16.       names: ds0
  17.     props:
  18.       # 打印执行的数据库以及语句
  19.       sql:
  20.         show: true
  21.     sharding:
  22.       tables:
  23.         [表名]:
  24.           # 指定表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...},但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...}
  25.           actual-data-nodes: ds0.[表名_]$->{0..1}
  26.           # 水平分表策略+行表达式分片
  27.           table-strategy:
  28.             inline:
  29.               algorithm-expression: [表名_]$->{[取模字段] % 2}
  30.               sharding-column: [取模字段]
复制代码
测试
[code]    @Test    public void  testSaveTraffic(){        Random random = new Random();        for(int i=0;i
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表