掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

news2024/11/29 18:32:10

文章目录

  • 什么是广播表
  • 广播表实战
    • 数据库配置表
    • Java配置实体类
    • 配置文件
    • 测试广播表
  • 水平分库+分表
    • 配置文件
    • 运行测试
  • 什么是绑定表?
  • 绑定表实战
    • 配置数据库
    • 配置Java实体类
    • 配置文件
    • 运行测试
  • 水平分库+分表后的查询和删除操作
    • 查询操作

什么是广播表

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全⼀致
适用于数据量不⼤且需要与海量数据的表进行关联查询的场景,例如:字典表、配置表

需求:在任意一个库中插入一条数据,另一个库中的相同表也插入这条数据

广播表实战

数据库配置表

脚本

CREATE TABLE `ad_config` (
	`id` BIGINT UNSIGNED NOT NULL COMMENT '主键id',
	`config_key` VARCHAR ( 1024 ) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配置key',
	`config_value` VARCHAR ( 1024 ) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配置value',
	`type` VARCHAR ( 128 ) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '类型',
	PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;

Java配置实体类

model层

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ad_config")
public class AdConfigDO {
    private Long id;
    private String configKey;
    private String configValue;
    private String type;
}

mapper层

public interface AdConfigMapper extends BaseMapper<AdConfigDO> {
}

配置文件

增加配置规则

#配置⼴播表
spring.shardingsphere.sharding.broadcasttables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE

配置文件完整

spring.application.name=xdclass-sharding-jdbc
server.port=8080

# 打印执行的数据库以及语句
spring.shardingsphere.props.sql.show=true

# 数据源 db0
spring.shardingsphere.datasource.names=ds0,ds1

# 第一个数据库
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://10.24.201.232:3306/xdclass_shop_order_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root


# 第二个数据库
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://10.24.201.232:3306/xdclass_shop_order_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1


#配置广播表
spring.shardingsphere.sharding.broadcast-tables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE



#id生成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE

# 指定product_order表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...},
# 但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1}

# 指定product_order表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{user_id % 2}

测试广播表

测试类

	@Test
    public void testSaveAdConfig(){
        AdConfigDO adConfigDO = new AdConfigDO();
        adConfigDO.setConfigKey("banner");
        adConfigDO.setConfigValue("xdclass.net");
        adConfigDO.setType("ad");

        adConfigMapper.insert(adConfigDO);
    }

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

水平分库+分表

需求:插入订单数据,分布在2个数据库和每个库的2张表中
分库规则:根据 user_id 进行分库
分表规则:根据 product_order_id 订单号(id字段)进行分表

配置文件

增加分库配置规则

# 配置分库规则
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2 }

修改数据节点配置规则

# 指定product_order表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...},
# 但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}

# 指定product_order表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}

运行测试

测试类

@Test
public void testSaveProductOrder(){
	Random random = new Random();
	for(int i=0; i<20;i++){
	ProductOrderDO productOrderDO = new ProductOrderDO();
	productOrderDO.setCreateTime(new Date());
	productOrderDO.setNickname("我是i"+i+"号");
  
	productOrderDO.setOutTradeNo(UUID.randomUUID().toString().substring(0,32));
	productOrderDO.setPayAmount(100.00);
	productOrderDO.setState("PAY");
	productOrderDO.setUserId(Long.valueOf(random.nextInt(50)));
	productOrderMapper.insert(productOrderDO);
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

什么是绑定表?

指分片规则⼀致的主表和子表
需求:product_order表和product_order_item表,均按照order_id分片,则此两张表互为绑定表关系

绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升

绑定表实战

配置数据库

脚本

CREATE TABLE `product_order_item_0` (
	`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`product_order_id` BIGINT DEFAULT NULL COMMENT '订单号',
	`product_id` BIGINT DEFAULT NULL COMMENT '产品id',
	`product_name` VARCHAR ( 128 ) DEFAULT NULL COMMENT '商品名称',
	`buy_num` INT DEFAULT NULL COMMENT '购买数量',
	`user_id` BIGINT DEFAULT NULL,
	PRIMARY KEY ( `id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;

在这里插入图片描述

配置Java实体类

model层

@Data
@TableName("product_order_item")
@EqualsAndHashCode(callSuper = false)
public class ProductOrderItemDO {

    private Long id;

    private Long productOrderId;

    private Long productId;

    private String productName;

    private Integer buyNum;

    private Long userId;
}

mapper层

public interface ProductOrderMapper extends BaseMapper<ProductOrderDO> {
    @Select("select * from product_order o left join product_order_item i on o.id=i.product_order_id")
    List<Object> listProductOrderDetail();
}

public interface ProductOrderItemMapper extends BaseMapper<ProductOrderItemDO> {
}

配置文件

添加配置:默认分库策略

#配置【默认分库策略】
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2 }

添加配置:配置绑定表

#配置绑定表
spring.shardingsphere.sharding.binding‐tables[0] = product_order,product_order_item

添加配置:分片键、分片策略

# 指定product_order_item表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order_item.actual-data-nodes=ds$->{0..1}.product_order_item_$->{0..1}
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.sharding-column=product_order_id
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.algorithm-expression=product_order_item_$->{product_order_id % 2}

运行测试

测试类

@Test
    public void testBingding(){
        List<Object> list = productOrderMapper.listProductOrderDetail();
        System.out.println(list);
    }

配置绑定表时SQL数量(性能):4条SQL
在这里插入图片描述

不配置绑定表时SQL数量(性能):8条SQL(注释掉绑定表的配置文件配置)
在这里插入图片描述

水平分库+分表后的查询和删除操作

查询操作

有分片键(标准路由)=in

测试类

	/**
     * 有分片键
     */
@Test
public void testPartitionKeySelect(){
	productOrderMapper.selectList(new QueryWrapper<ProductOrderDO>().eq("id",835146820605710336L));
	//productOrderMapper.selectList(new QueryWrapper<ProductOrderDO>().in("id",Arrays.asList(1464129579089227778L,1464129582369173506L,1464129583140925441L)));
    }

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

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

相关文章

redis(win版)

1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。基于内存存储&#xff0c;读写性能高适合存储热点数据&am…

SealOS 一键安装 K8S

环境 # 查看系统发行版 $ cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NA…

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码&#xff1a;Hello&#xff0c;vue1.1 v-bind 设置元素的属性 简写 &#xff1a;1.2 v-if &#xff0c; v-else &#xff0c; v-else-ifv-if , v-e…

【Npde.js】express以及nodemon

express初始Express什么是Express不使用Express可以创建web服务器吗&#xff1f;Express能做什么安装Express监听GET请求和post请求获取URL中携带的查询参数获取URL中携带的动态参数托管静态资源nodemon为什么使用nodemon初始Express 什么是Express 官方给出的概念&#xff0…

ctf pwn基础-1

在心中做了无数次决定&#xff0c;我终于还是准备学pwn了&#xff0c;为了继承学长的衣钵&#xff0c;更别说自己已经下定决心学习 c了&#xff0c;废话不多说下面正式开始。 目录 基础 实列讲解 基础 很多人一上来就叫你什么汇编啊、c啊什么的&#xff0c;让人往而却步&…

分布式任务调度处理方案(无代码)

业务涉及到&#xff0c;需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。如何解决问题&#xff0c;先分析cap&#xff0c;是要保证可用性&#xff0c;还是保证一致性。如何选择是CP还是AP&#xff1f;分析业务场景CP的场景&#xff1…

canvas样式与颜色,字体,图片,状态,形变

色彩 fillStyle color 设置图形的填充颜色。 strokeStyle color 设置图形轮廓的颜色。 备注&#xff1a; 一旦您设置了 strokeStyle 或者 fillStyle 的值&#xff0c;那么这个新值就会成为新绘制的图形的默认值。如果你要给每个图形上不同的颜色&#xff0c;你需要重新设置…

Java Scanner 类,超详细整理,适合新手入门

目录 一、什么是 Java Scanner 类&#xff1f; 二、引用数据类型 1、引用数据类型的定义 三、Scanner 类有哪些常用方法&#xff1f; hasNext()用法 四、next() 与 nextLine() 区别 next(): nextLine()&#xff1a; 五、使用 next 方法 五、使用 nextLine方法 一、什…

SkyWalking仪表盘使用

Skywalking仪表盘使用 1 仪表盘 作用&#xff1a;查看被监控服务的运行状态。 1)监控面板 1.1 APM APM&#xff1a;应用性能管理&#xff0c;通过各种探针采集数据&#xff0c;收集关键指标&#xff0c;同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案…

机器学习主要内容的思维导图

机器学习 机器学习&#xff1a; 定义&#xff1a;能够从经验中学习从而能够 把事情不断做好的计算机程序 人工智能的一个分支和 实现方式 理论基础&#xff1a;概率论 数理统计 线性代数 数学分析 数值逼近 最优化理论 计算复杂理论 核心要素&#xff1a;数据 算法 模型 机器…

【极海APM32替代笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时

【极海APM32替代笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是…

论文解读 | [AAAI2020] 你所需要的是边界:走向任意形状的文本定位

目录 1、研究背景 2、研究的目的 3、方法论 3.1 Boundary Point Detection Network(BPDN) 3.2 Recognition Network 3.3 Loss Functions 4、实验及结果 论文连接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/6896 1、研究背景 最近&#xff0c;旨在…

2023美赛C题Wordle二三问分布预测和难度分类预测

文章目录前言题目介绍人数分布预测首先建立字母词典&#xff0c;加上时间特征数据预处理训练和预测函数保存模型函数位置编码模型及其参数设置模型训练以及训练曲线可视化预测人数分布难度分类预测总结前言 2023美赛选了C题&#xff0c;应该很多人会选&#xff0c;一看就好做&…

电动汽车充放电的优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

深度学习无监督磁共振重建方法调研(二)

深度学习无监督磁共振重建方法调研&#xff08;二&#xff09;Self-supervised learning of physics-guided reconstruction neural networks without fully sampled reference data&#xff08;Magnetic Resonance in Medicine 2020&#xff09;模型设计实验结果PARCEL: Physi…

如何保证数据的安全?对称和非对称加密,身份认证,摘要算法,数字证书等傻傻分不清?波哥图解带你彻底掌握

支付安全 1.基础概念 明文&#xff1a;加密前的消息叫“明文”&#xff08;plain text&#xff09; 密文&#xff1a;加密后的文本叫“密文”&#xff08;cipher text&#xff09; 密钥&#xff1a;只有掌握特殊“钥匙”的人&#xff0c;才能对加密的文本进行解密&#xff0c;…

功能测试三年,是时候做出改变了

前言 测试行业3年多经验&#xff0c;学历大专自考本科&#xff0c;主要测试方向web&#xff0c;PC端&#xff0c;wap站&#xff0c;小程序公众号都测试过&#xff0c;app也测过一些&#xff0c;C端B端都有&#xff0c;除功能外&#xff0c;接口性能也有涉猎&#xff0c;但是不…

day32 多线程(上)

文章目录相关概念codeThreadTest01ThreadTest02 编写一个类&#xff0c;直接继承java.lang.Thread&#xff0c;重写run方法ThreadTest03 实现线程的第二种方法ThreadTest04 采用匿名内部类的方式ThreadTest05 获取线程名字ThreadTest06 sleep方法sleep面试题ThreadTest08 终止线…

不同路径-力扣62-java 动态规划

一、题目描述一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f…

H12-831题库(有详细的解析)

1.&#xff08;单选&#xff09;某工程师利用2台路由器进行IPv6业务测试,通过运行BGP4模拟总部与分支的互联互通。如图所示,某工程师抓包查看R1发出的update报文。关于该报文信息的描述,以下哪个说法是正确的? A.该报文描述的路由的下一跳地址为:2001:db8::2345:1::1 B.该报文…