ShardingSphere实战(3)- 快速实现分库分表

news2024/9/22 17:36:42

上篇博客,我们讲了 ShardingSphere实战(2)- 水平分表 ,这篇博客,我们继续实现分库以及解决前面遗留的问题。

一、绑定表

基于上篇博客配置的前提下(上篇博客的最后放上了完整的配置,需要的可以去看看,这里就不重复写上去了),加上绑定表的配置:

# 绑定表关系
spring.shardingsphere.sharding.binding-tables=t_order,t_order_item

1. 查询数据

/**
 * 多个表水平分表测试-查询
 */
@GetMapping("/test4")
public String test4(@RequestParam("orderId") Long orderId) {

    List<OrderItemExtDO> orderDO = orderMapper.findOrderAndOrderItemsByOrderId(orderId);
    log.info("orderDO: {}", orderDO.toString());

    return "success";
}
<select id="findOrderAndOrderItemsByOrderId" resultType="com.shardingsphere.demo.dal.entity.OrderItemExtDO">
    select t1.order_id t1OrderId,
           t1.order_no orderNo,
           t2.order_id t2OrderId
    from t_order t1
             inner join t_order_item t2 on t1.order_id = t2.order_id
    where t1.order_id = #{orderId,jdbcType=BIGINT}
</select>

2. 对比结果

配置绑定表关系之前:
取的是笛卡尔积
在这里插入图片描述

配置绑定表关系之后:
在这里插入图片描述

3. 绑定表总结

绑定表是指那些经常一起使用的表,例如在联表查询中同时出现的订单表 t_order 和订单详情表 t_order_item。ShardingSphere 会将 t_ordert_order_item 视为一组绑定表,在执行 SQL 查询时,如果涉及到这两张表,ShardingSphere 会确保它们的数据分布在相同的分片上,从而避免跨库的复杂联表查询,提高查询效率。

绑定表的原理

  • 数据一致性:绑定表的数据会在同一个数据库分片中,保证了数据的一致性和完整性。
  • 查询优化:避免了跨库的联表查询,减少了网络延迟和查询时间。

配置注意事项

  • 表名顺序:在 binding-tables 配置中,表名的顺序很重要,通常主表(如 t_order)放在前面,从表(如 t_order_item)放在后面。
  • 关联字段:绑定表通常通过一个共同的字段(如订单ID)关联,这个字段需要在所有绑定表中存在且类型一致。
  • 分片策略:确保绑定表使用相同的分片策略,这样它们才能被正确地分配到同一个分片上。

二、水平分库

1. 创建数据库

create database ds-0;
create database ds-1;

 # 分别在ds-0和ds-1中创建下面的表
create table t_order_0
(
    order_id    bigint         not null
        primary key,
    order_no    varchar(100)   null,
    create_name varchar(50)    null,
    price       decimal(10, 2) null
)
create table t_order_1
(
    order_id    bigint         not null
        primary key,
    order_no    varchar(100)   null,
    create_name varchar(50)    null,
    price       decimal(10, 2) null
)
create table t_order_2
(
    order_id    bigint         not null
        primary key,
    order_no    varchar(100)   null,
    create_name varchar(50)    null,
    price       decimal(10, 2) null
)

create table t_order_item_0
(
    order_item_id bigint         not null
        primary key,
    item_id       bigint         null,
    order_id      bigint         null,
    item_name     varchar(50)    null,
    price         decimal(10, 2) null
)
create table t_order_item_1
(
    order_item_id bigint         not null
        primary key,
    item_id       bigint         null,
    order_id      bigint         null,
    item_name     varchar(50)    null,
    price         decimal(10, 2) null
)
create table t_order_item_2
(
    order_item_id bigint         not null
        primary key,
    item_id       bigint         null,
    order_id      bigint         null,
    item_name     varchar(50)    null,
    price         decimal(10, 2) null
)

在这里插入图片描述

2. 配置分片策略

基于上一篇博客的分片策略,做一些修改:

# sharding-jdbc 水平分表策略
# 给数据源起别名,这里名称需要和下面的一致
spring.shardingsphere.datasource.names=ds-0,ds-1

# 配置数据源
spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://xxx:3316/ds-0?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-0.username=xxx
spring.shardingsphere.datasource.ds-0.password=xxx
spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://xxx:3316/ds-1?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-1.username=xxx
spring.shardingsphere.datasource.ds-1.password=xxx

####################### 配置分片表t_order #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds-$->{0..1}.t_order_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 3}


####################### 配置分片表t_order_item #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds-$->{0..1}.t_order_item_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 3}


# 绑定表关系
spring.shardingsphere.sharding.binding-tables=t_order,t_order_item

# 是否开启 SQL解析日志
spring.shardingsphere.props.sql.show=true

mybatis.mapper-locations=classpath:sqlmapper/*.xml

3. 保存测试

/**
 * 多个表水平分库分表测试-保存
 */
@GetMapping("/test3")
public String test3(@RequestParam("count") Integer count) {

    for (int i = 0; i < count; i++) {
        OrderDO order = new OrderDO();
        order.setOrderId(this.getId());
        order.setOrderNo("A" + order.getOrderId());
        order.setCreateName("订单 " + order.getOrderId());
        orderMapper.insertSelective(order);

        OrderItemDO orderItem = new OrderItemDO();
        orderItem.setOrderItemId(order.getOrderId());
        orderItem.setOrderId(order.getOrderId());
        orderItemMapper.insertSelective(orderItem);
    }
    return "success";
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 单表查询测试

/**
     * 单个表水平分表测试-查询
     */
    @GetMapping("/test2")
    public String test2(@RequestParam("orderId") Long orderId) {

        OrderDO orderDO = orderMapper.selectByPrimaryKey(orderId);
        log.info("orderDO: {}", orderDO.toString());

        return "success";
    }

运行结果:
在这里插入图片描述

5. 绑定表查询测试

上面有绑定表的测试代码,这里就不重复写了,和上面一样,直接看运行结果:
在这里插入图片描述
结果也没问题,没有跨库跨表查询

三、完整配置

老规矩,下面是本篇博客关于ShardingSphere的完整配置:

# sharding-jdbc 水平分表策略
# 给数据源起别名,这里名称需要和下面的一致
spring.shardingsphere.datasource.names=ds-0,ds-1

# 配置数据源
spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://xxx:3316/ds-0?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-0.username=xxx
spring.shardingsphere.datasource.ds-0.password=xxx
spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://xxx:3316/ds-1?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-1.username=xxx
spring.shardingsphere.datasource.ds-1.password=xxx

####################### 配置分片表t_order #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds-$->{0..1}.t_order_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 3}


####################### 配置分片表t_order_item #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds-$->{0..1}.t_order_item_$->{0..2}

### 分库策略
# 分库分片健
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.sharding-column=order_id
# 分库分片算法
spring.shardingsphere.sharding.tables.t_order_item.database-strategy.inline.algorithm-expression=ds-$->{order_id % 2}

### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 3}


# 绑定表关系
spring.shardingsphere.sharding.binding-tables=t_order,t_order_item

# 是否开启 SQL解析日志
spring.shardingsphere.props.sql.show=true

mybatis.mapper-locations=classpath:sqlmapper/*.xml

总结:本篇博客实现了水平分库分表,后续会陆续更新广播表默认表路由读写分离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCI-e(篇一):科普——PCI-e到底是什么?PCI-e的前世今生

一、什么是PCIE接口&#xff1f; PCI-e接口的全称是Peripheral Component Interconnect Express&#xff0c;是一种高速串行计算机扩展总线标准。它原来的名字是“3GIO”&#xff0c;是由Intel在2001年提出的&#xff0c;旨在替代旧的PCI&#xff0c;PCI-X和AGP总线标准。 PC…

SpringBoot使用泛型出入参+策略模式+反射+缓存实现统一POST接口入口

简介 某些情况下需要统一入口&#xff0c;如&#xff1a;提供给第三方调用的接口等。减少接口对接时的复杂性。 代码实现 GenericController.java 统一入口&#xff0c;通过bean name进行调用service层invoke方法 import com.fasterxml.jackson.databind.ObjectMapper; imp…

Python爬虫入门(结合网站代码演示)

原理 第一步发送请求 与浏览器请求访问服务器地址一样&#xff0c;python程序向服务器发送访问请求&#xff0c;服务器返回数据。 在python中我们可以使用 第二步解析网页内容 浏览器在接收到服务器返回的数据后&#xff0c;会自行解析内容最后呈现出我们所看到的界面。但是在程…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx&#xff08;yum安装和源码安装&#xff09; 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx&#xff08;发音为“engine X”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器使用。它被广泛应用于高流量…

linux进程控制——进程等待——wait、waitpid

前言&#xff1a;本节内容仍然是进程的控制&#xff0c;上一节博主讲解的是进程控制里面的进程创建、进程退出、终止。本节内容将讲到进程的等待——等待是为了能够将子进程的资源回收&#xff0c;是父进程等待子进程。 我们前面的章节也提到过等待&#xff0c; 那里的等待是进…

《C++基础入门与实战进阶》专栏介绍

&#x1f680; 前言 本文是《C基础入门与实战进阶》专栏的说明贴&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09;。 专栏介绍&#xff1a;以多年的开发实战为基础&#xff0c;总结并讲解一些的C/C基础与项目实战进阶内…

在MySQL中COUNT(*)、COUNT(列)和COUNT(DISTINCT 列)有什么区别

本文还发布在我的 medium 和 掘金 上 这篇文章让我们看看MySQL中count(*)和count(column_name)有什么区别。也许你知道它们都是计算结果行数的&#xff0c;那么在使用的时候如何选择呢。 我在MySQL库中创建了一个t_hero表 CREATE TABLE t_hero (id int NOT NULL,name char(10)…

软件测试——用例篇(上)

概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀&#xff1a; 测试⽤例中⼀个必需部分是对…

AI-WEB-1.0 靶机

AI-WEB-1.0 一、安装靶机环境 下载地址&#xff1a; https://www.vulnhub.com/entry/ai-web-1,353/ 下载压缩文件打开 开启虚拟机 二、信息收集 1.查看NAT模式IP段 编辑–>虚拟网络编辑器 御剑2014查IP 找到ip之后就访问网站 用扫描目录的工具扫描当前网站的目录 访问…

复制知乎文字内容

复制知乎文字内容 以edge浏览器为例&#xff1a; 以edge浏览器为例&#xff1a; 先点击F12&#xff08;也就是鼠标右键->检查&#xff09;再点击F1选择禁用Javascript 之后知乎的文字就可以正常复制了。 &#xff08;注意&#xff1a;退出浏览器的时候记得把这一条恢复过…

XAML 热重载应用程序

XAML 热重载&#xff08;Hot Reload&#xff09;是一个在开发过程中提高效率的功能&#xff0c;它允许开发者在应用程序运行时修改 XAML 代码&#xff0c;而不需要重新启动应用程序。这个功能非常适合于调试和即时预览 UI 更改。以下是如何在应用程序中使用 XAML 热重载的一些基…

CVE-2022-21663: WordPress <5.8.3 版本对象注入漏洞深入分析

引言 在网络安全领域&#xff0c;技术的研究与讨论是不断进步的动力。本文针对WordPress的一个对象注入漏洞进行分析&#xff0c;旨在分享技术细节并提醒安全的重要性。特别强调&#xff1a;本文内容仅限技术研究&#xff0c;严禁用于非法目的。 漏洞背景 继WordPress CVE-2…

系统设计中15 个最重要的权衡

系统设计的第一法则&#xff1a;一切都与权衡有关。 在设计系统时&#xff0c;我们需要决定要包含哪些功能以及要忽略哪些功能。每次我们做这个决定时&#xff0c;我们都在进行权衡。在本文中&#xff0c;我们将探讨系统设计中遇到的15个最常见的权衡问题&#xff0c;并使用实…

第十四天学习笔记2024.7.25

Git安装 1.安装git 2.创建git仓库 3.创建文件并且提交文件 &#xff08;git add . 将文件提交到缓存&#xff09;&#xff08;git commit -m 说明&#xff09;&#xff08;git log 查看历史&#xff09; 4.分支创建与解决分支冲突问题 创建主机&#xff08;git 192.1…

手机三要素接口怎么对接呢?(二)

一、什么是手机三要素&#xff1f; 手机三要素又叫运营商三要素&#xff0c;运营商实名认证&#xff0c;运营商实名核验&#xff0c;手机三要素实名验证&#xff0c;手机三要素实名核验&#xff0c;每个人的称呼都不同&#xff0c;但是入参和出参是一样的。 输入姓名、身份证…

24暑假算法刷题 | Day25 | 回溯算法 III | LeetCode 491. 非递减子序列,46. 全排列,47. 全排列 II

目录 491. 非递减子序列题目描述题解 46. 全排列题目描述题解 47. 全排列 II题目描述题解 491. 非递减子序列 点此跳转题目链接 题目描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任…

MELLE: Autoregressive Speech Synthesis without Vector Quantization

2024.7MICROSOFT 文章目录 MELLE: Autoregressive Speech Synthesis without Vector Quantizationabstractmethod损失函数 Autoregressive Image Generation without Vector Quantizationabstractmethods更好的AR modelresults MELLE: Autoregressive Speech Synthesis without…

UI框架与MVC模式详解(3)——MVC\MVP\MVVM

【PDI模式】 前文中&#xff0c;我们详细讲解了为实现一个涉及UI的功能所必须得三者&#xff0c;简称PDI&#xff1a; Panel类&#xff1a;主要实现交互逻辑、显示逻辑的地方以及保存界面相关的数据的地方Data类&#xff1a;数据管理类&#xff0c;主要是业务相关的数据Inter…

小白也能轻松学的计算机网络零基础入门(附学习路线 + 计算机网络教程)

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 介绍 计算机网络是指将地理位置不同的多台计算机或设备通过通信线路进行连接&#xff0c;从而实现信息传递和资源共享&#xff0c;或者组成一个更完整的计算机系统。 如今&…

【MySQL】用户管理连接池原理{数据库权限/连接池/mysql访问逻辑}

文章目录 1.普通用户的引入用户创建用户删除用户修改用户密码 2.数据库的权限给用户授权回收权限实操过程 3.简略介绍mysql连接池3.一个用户注册/登录/使用网页版mysql逻辑 1.普通用户的引入 用户 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 mysql> use…