当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习一下,下面文章就记录一下如何用ShardingSphere来进行分库分表!(能力有限,本章不会讲原理奥,只是记录如何分库分表,原理方面后面我学习了再写,现在先会用先0.0,)

1、官网文档地址

这是ShardingSphere官网文档的地址,有需要的可以点进去看一下。

2、技术及环境

数据库 项目用到的技术
mysql5.6 springboot、mybatis、shardingsphere

3、建库建表

1、新建两个数据库:一个user0,一个user1。2、在user0数据库新建两个表:一个us_admin0,一个us_admin1,新建语句如下:

CREATE TABLE `us_admin0` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `user_id` int(11) NOT NULL COMMENT '用户id', `addr_id` int(11) NOT NULL COMMENT '地址id',  `user_name` varchar(64) NOT NULL COMMENT '用户编号',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

CREATE TABLE `us_admin1` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `user_id` int(11) NOT NULL COMMENT '用户id', `addr_id` int(11) NOT NULL COMMENT '地址id',  `user_name` varchar(64) NOT NULL COMMENT '用户编号',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

3、在user1数据库新建两个表:一个us_admin0,一个us_admin1,新建语句如下:

CREATE TABLE `us_admin0` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `user_id` int(11) NOT NULL COMMENT '用户id', `addr_id` int(11) NOT NULL COMMENT '地址id',  `user_name` varchar(64) NOT NULL COMMENT '用户编号',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

CREATE TABLE `us_admin1` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `user_id` int(11) NOT NULL COMMENT '用户id', `addr_id` int(11) NOT NULL COMMENT '地址id',  `user_name` varchar(64) NOT NULL COMMENT '用户编号',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

4、搭建springboot项目

这部分就idea自己创建一下就好了,pom文件及配置文件内容如下:

pom文件:

<?xml  version="1.0" encoding="UTF-8"?>"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.springframework.bootspring-boot-starter-parent2.0.7.RELEASE com.shardingsphere1.0.0-SNAPSHOTsphereDemo project for Spring Boot1.8Hoxton.SR33.8.28.0.12junitjunit4.12testorg.springframework.bootspring-boot-starter-web-servicesorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.apache.shardingspheresharding-jdbc-spring-boot-starter4.0.0-RC1com.alibabadruid-spring-boot-starter1.1.14mysqlmysql-connector-javaorg.springframework.bootspring-boot-starter-actuatororg.mybatis.spring.bootmybatis-spring-boot-starter2.1.2org.springframework.bootspring-boot-maven-plugin

application.yml配置:

# 服务端口server:  port: 8888

# 服务名spring:  application:    name: test-user  # 配置sharding jdbc分片规则  shardingsphere:    datasource:      # 连接名称(下面要用这个名称来区分库)      names: ds0,ds1      ds0:        type: com.alibaba.druid.pool.DruidDataSource        driver-class-name: com.mysql.jdbc.Driver        url: jdbc:mysql://192.168.1.19:3306/user0?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8        username: root        password: 123        initialSize: 5      #初始化大小        maxActive: 200       #最大值        maxWait: 2000      #最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms        timeBetweenEvictionRunsMillis: 60000    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接      ds1:        type: com.alibaba.druid.pool.DruidDataSource        driver-class-name: com.mysql.jdbc.Driver        url: jdbc:mysql://192.168.1.19:3306/user1?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8        username: root        password: 123        initialSize: 5      #初始化大小        maxActive: 200       #最大值        maxWait: 2000      #最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms        timeBetweenEvictionRunsMillis: 60000    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接    # 配置分片规则    sharding:      # 按表来区分      tables:        us_admin:          # 配置数据节点          actualDataNodes: ds${0..1}.us_admin${0..1}          # 分库策略          databaseStrategy:            inline:              # 分库的规则 用user_id这个字段来分库 总共有两个库 及ds0(user0)与ds1(user1)              shardingColumn: user_id              algorithmExpression: ds${user_id % 2}          # 分表策略          tableStrategy:            inline:              shardingColumn: addr_id              algorithmExpression: us_admin${addr_id % 2}          keyGenerator:            column: id            type: SNOWFLAKE      bindingTables:        us_admin      broadcastTables:        t_config      defaultDataSourceName: ds0

    props:      sql.show: true

# 配置xml 的扫描路径mybatis:  mapper-locations: classpath:mapper/*.xml  check-config-location: true  type-aliases-package: com.sharding.sphere.model  configuration:    cacheEnabled: true    mapUnderscoreToCamelCase: true

5、接口测试

编写增删改接口进行测试,分库根据user_id来切片,分表根据addr_id来切片,分别插入一些数据,结果如下:

@RestControllerpublic class UserController {

    @Resource    UserService userService;

    @RequestMapping("add")    public Integer add(@RequestBody UsAdmin usAdmin){        Integer add = userService.add(usAdmin);        return add;    }

    @RequestMapping("select")    public List select(){        List select = userService.select();return select;    }@RequestMapping("delect")public Integer delect(Long id){        Integer delect = userService.delect(id);return delect;    }}

查询sql语句:

<select id="selectAll" resultMap="BaseResultMap">    select      id, addr_id, user_id, user_name    from us_admin  select>

新增sql语句:

<insert id="insertSelective" parameterType="com.sharding.sphere.model.UsAdmin">    insert into us_admin    <trim prefix="(" suffix=")" suffixOverrides=",">      <if test="id != null">        id,      if>      <if test="userId != null">        user_id,      if>      <if test="addrId != null">        addr_id,      if>      <if test="userName != null">        user_name,      if>    trim>    <trim prefix="values (" suffix=")" suffixOverrides=",">      <if test="id != null">        #{id,jdbcType=BIGINT},      if>      <if test="userId != null">        #{userId,jdbcType=INTEGER},      if>      <if test="addrId != null">        #{addrId,jdbcType=INTEGER},      if>      <if test="userName != null">        #{userName,jdbcType=VARCHAR},      if>    trim>  insert>

删除sql语句:

 delete from us_admin    where id = #{id,jdbcType=BIGINT}

数据新增分表分库结果:

image

查询结果:

image

可以看到,新增数据的时候以user_id%2来计算分库,双数在user0库,单数在user1库,addr_id作为分表id,双数在us_admin0表,单数在us_admin1表,先确定库然后确定表,而查询一条语句可以查询到所有,不过ShardingSphere好像有些sql语句是不支持的,比如关联自己这种操作(us_admin left join us_admin这种),还有一些不支持的sql,具体的可以百度看看。

讲道理来看,ShardingSphere其实对代码的侵入量并不算多,只是有一些配置,配置好之后该写的sql跟原来一样的,可能是还没有踩到该踩的坑吧,等周末研究一下原理之后再写一篇文章分析分析。

6、公众号

如果你觉得我的文章对你有帮助话,欢迎关注我的微信公众号:"一个快乐又痛苦的程序员"(无广告,单纯分享原创文章、已pj的实用工具、各种Java学习资源,期待与你共同进步)

server sql 水平分表_springboot集成Shardingsphere进行分库分表相关推荐

  1. Shardingsphere的分库分表+读写分离+分页条件查询

    Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...

  2. mysql 横向分表合并_MySQL横向扩展-分库分表解决方案总结

    从业务场景看分库分表 互联网行业中,业务场景通常写少读多的情况居多,在MySQL的使用前期,读性能大多可以通过SQL优化来解决,但随着业务的持续发展,单纯依靠SQL的查询优化会越来越难以达到业务服务要 ...

  3. mysql分表后怎么索引_分库分表后的索引问题

    摘要 最近遇到一个慢sql,在排查过程中发现和分库分表后的索引设置有关系,总结了下问题. 问题 在进行应用健康度盘点时,发现有个慢sql 如下 select brandgoodid from bran ...

  4. MySQL分库分表会带来哪些问题?分库分表问题

    MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...

  5. ShardingSphere(八) 分库分表的多种分片策略

    在之前文章<ShardingSphere(二) 水平分表配置搭建,实现分表写入读取>中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业 ...

  6. ShardingSphere JDBC 分库分表 读写分离 数据加密

    简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...

  7. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  8. python mysql分库分表_干货 : 常用MySQL分库分表方案

    Python乱炖推荐搜索后浪 动森玩家 送书 数据分析 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Serv ...

  9. 数据库表设计的随笔(分库分表)

    笔者目前就职的是一家创业型的互联网公司,既然算是互联网公司,那么就会设计到无论是应用系统还是数据库的分布式.下面简单介绍下有关数据库方面的一些设计. 数据库表的设计,根据自己的业务所需可以拆分成多库. ...

最新文章

  1. php小程序登录code无效,微信小程序出现“invalid code”怎么办
  2. c++ 获取文件的hashcode_jsp 实现文件上传和下载
  3. 什么是raid 容错式磁盘阵列?
  4. java多线程优先级的方法_Java多线程以及线程优先级
  5. python语言保留字的特点_python保留字及其说明
  6. 小熊的日记图文列表布局小程序模板
  7. 60-400-045-使用-binlog-Maxwell读取MySQL binlog日志到Kafka
  8. linux 退出java,linux kill命令下如何优雅的退出java程序
  9. Qt学习之路(51): QByteArray和QVariant
  10. 格式要求_课题论文的格式要求
  11. ”0元中标的商业逻辑“ -- 如何更好防范项目风险(北京软件造价评估技术创新联盟:李培圣)...
  12. Java经典算法50道题
  13. 使用python实现可视化ftp客户端(本地文件展示和搜索功能、ftp文件展示和搜索功能以及上传和下载功能)
  14. NanoPC-T4 RK3399和PC局域网络传输摄像头视频python
  15. gmp 5.0.1 windows 下编译使用
  16. 画法几何及工程制图考试卷A卷
  17. 宏定义超过字长的一些问题
  18. 中美跨境电商贸易投资云洽会成功举办;TT Shop和TTforBusiness将互通;PhonePe月破20亿...|洞悉跨境
  19. 官方微信支付跟特约商户的区别
  20. C#调用Excel版本不兼容的解决方法

热门文章

  1. 使用ACME部署生成阿里云免费HTTPS证书
  2. 免费的定时任务托管 clock.sh
  3. 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
  4. java heap buffer direct buffer_java NIO - DirectBuffer 和 HeapBuffer
  5. 1命名规则 sentinel_Alibaba Sentinel 规则参数总结
  6. myftpadmin+proftpd+mysql架设ftp服务器_linux下用Proftpd搭建ftp服务器及配置方法
  7. 九年级数学解方程50道_【初中数学】北师大版九年级上册数学知识点总结
  8. vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
  9. yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort
  10. 电脑端腾讯视频如何设置离线下载完成后自动关机