闲谭SpringBoot--ShardingSphere分库分表探究

文章目录

  • 1. 背景
  • 2. 创建数据库
  • 3. 修改yml配置文件
  • 4. 分片算法类
  • 5. 测试
  • 6 小结

1. 背景

接上文,我们对日志表,进行了按月的分表,这样每个月几百万条数据量还是扛得住的。

但是如果数据再多呢,除了提高硬件性能,还有一个可以考虑的方案就是分库。

例如,我们通过数据所属的地域、公司、部门等进行分库划分,当然具体根据什么划分,由需求决定。

本篇我们在上一篇《闲谭SpringBoot–ShardingSphere分表探究》的基础上,对日志表进一步按机构进行划分。

2. 创建数据库

首先创建两个数据库test、test1,每个数据库中都放入log_202411、log_202412、log202501、log_202502四张表,四张表结构是一样的如下:

注意,我们想实现按机构编号departId分库,然后同一个机构的数据,根据time再按月分表。

CREATE TABLE `log_202411` (`id` bigint(20) NOT NULL,`content` varchar(255) DEFAULT '',`time` datetime DEFAULT NULL,`departId` bigint(20) DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

3. 修改yml配置文件

配置两个数据库,注意ds0和ds1分别对应数据库test/test1。
在这里插入图片描述
配置分片方式,首先配置默认的库:
然后
然后针对log表配置分片规则,如下表达式意味着:对log表来说,数据库是ds加一个字符串,表则是log加一个字符串,至于加什么字符串,由分片算法指定。
在这里插入图片描述

接下来就是分片算法了,注意按机构分库我们只需要使用=和IN操作,所以只需要配置精确分片算法即可。

而时间还需要范围查询,所以按时间分表还需要一个范围分片算法。
在这里插入图片描述

完整配置如下:

server:port: 8080servlet:context-path: /sharding
spring:shardingsphere: # 数据库配置sharding:default-data-source-name: ds0 #注意:不分库时,默认的数据库源default-database-strategy: #默认的分库策略inline:sharding-column: idalgorithm-expression: ds0tables: #数据分片规则配置log: # 逻辑表名称actual-data-nodes: ds${0..1}.log$->{1..2} # 由数据源名 + 表名组成(参考 Inline 语法规则)database-strategy: # 分库策略standard:precise-algorithm-class-name: org.example.sharding.config.DepartPreciseShardingAlgorithm # 精确分片算法类名称,用于=和INsharding-column: departId # 分片列名称table-strategy: # 分表策略standard: # 行表达式分片策略precise-algorithm-class-name: org.example.sharding.config.MonthPreciseShardingAlgorithm # 精确分片算法类名称,用于=和INsharding-column: time # 分片列名称range-algorithm-class-name: org.example.sharding.config.MonthRangeShardingAlgorithm  # 范围分片算法类名称,用于BETWEENkey-generator: # key生成器column: idtype: SNOWFLAKE  # SnowflakeShardingKeyGeneratorprops:worker: # SNOWFLAKE算法的worker.idid: 100max: # SNOWFLAKE算法的max.tolerate.time.difference.millisecondstolerate:time:difference:milliseconds: 20datasource:names: ds0,ds1ds0:type: com.alibaba.druid.pool.DruidDataSourcename: testdriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=trueusername: rootpassword: 123456ds1:type: com.alibaba.druid.pool.DruidDataSourcename: test1driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=trueusername: rootpassword: 123456

4. 分片算法类

编写按机构分库算法类:

/*** 按机构精确分片算法类*/
/*** 按机构精确分片算法类*/
@Slf4j
public class DepartPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {// 获取分片键值Object object = shardingValue.getValue();Integer num = 0;//默认分片序号try {num = Integer.parseInt(object.toString()) % 2;//机构id为偶数,数据进入ds0;机构id为奇数,数据进入ds1;} catch (Exception e) {log.error("按机构精确分片算法类报错:{}", e.getMessage());}// 返回要进入的表名称String tableName = "ds" + num;log.info("精确分片结果:{}", tableName);return tableName;}
}

5. 测试

接下来发起测试,我们测试一个机构id为偶数的例子:
在这里插入图片描述

通过断点查看分片情况,首先触发了分库分片算法,数据进入ds0
在这里插入图片描述

然后触发了分表分片算法:
在这里插入图片描述
所以数据会进入ds0库的log_202501表。
在这里插入图片描述
然后我们测试下查询:
在这里插入图片描述
运行后分片结构如下:
在这里插入图片描述
说明我们的分片算法是正确的。

6 小结

通过分库分表,支持每月千万级数据量问题基本不大。

如果再多,每月上亿、十亿、百亿级别,哈哈,我也不知道啦,因为我还没遇到过。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT面试求职系列主题-Jenkins

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统&#xff0c;并在发生更改时启动和监视构建系统。 2&#xff09;Maven、Ant和Jenkins有什么区别…

STM32供电参考设计

STM32供电参考设计 ​ 在图中有VDD&#xff0c;VSS和VDDA&#xff0c;VSSA两种类型的供电引脚&#xff0c;其数据手册解释如下&#xff1a; ​ 令我不解的是&#xff1a;VDDA和VSSA必须分别连接到VDD和VSS&#xff0c;这是什么意思&#xff1f;有大佬能够解答一下吗&#xff1f…

和为0的四元组-蛮力枚举(C语言实现)

目录 一、问题描述 二、蛮力枚举思路 1.初始化&#xff1a; 2.遍历所有可能的四元组&#xff1a; 3.检查和&#xff1a; 4.避免重复&#xff1a; 5.更新计数器&#xff1a; 三、代码实现 四、运行结果 五、 算法复杂度分析 一、问题描述 给定一个整数数组 nums&…

嵌入式系统 (2.嵌入式硬件系统基础)

2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心&#xff0c;主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构&#xff1a;前者指令和数据共享同一存储空间…

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还&#xff1a;看到一男子拖走一女子就以为小情侣吵架而已&#xff08;可能人贩子&#xff09;&#xff1b;看到男友对你好个几次就从此死心塌地&#xff08;可能有手就行&#xff0c;细节装装而已&#xff09;结果耽误终身&#xff1b;看到女同事对你微笑不排斥就以为…

(七)人工智能进阶之人脸识别:从刷脸支付到智能安防的奥秘,小白都可以入手的MTCNN+Arcface网络

零、开篇趣谈 还记得第一次用支付宝"刷脸"时的新奇感吗&#xff1f;或者被抖音的人脸特效逗乐的瞬间&#xff1f;这些有趣的应用背后&#xff0c;其实藏着一个精妙的AI世界。今天&#xff0c;就让我们开启一段奇妙的人脸识别技术探索之旅吧&#xff01; 一、人脸识…

腾讯云AI代码助手编程挑战赛-图片转换工具

作品简介&#xff1a; 解决了人们学习生活中的图片格式转换问题&#xff0c; 制作该脚本&#xff0c;省去了打开在线编辑器操作的时间&#xff0c; 免费为用户提供图片格式的转换的实用小工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c; 引用PIL包转换图…

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式&#xff0c;可简写为:xxx v-model :双向数据绑定。 v-for&#xff1a;遍历数组/对象/字符串 v-on&#xff1a;绑定事件监听&#xff0c;可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…

高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解

在高山旅游景区&#xff0c;传统的物资运输方式往往面临人力成本高昂、效率低下等问题&#xff0c;而无人机技术的引入为这一难题提供了新的解决方案。以下是对无人机从山下到山上进行物资吊运技术的详细解析&#xff1a; 一、无人机物资吊运技术的优势 1. 降低人力成本&#…

【Linux】shell脚本编程

目录 概念&#xff1a; shell脚本的本质&#xff1a; shell脚本编程&#xff1a; shell变量&#xff1a; 变量的定义格式&#xff1a; 变量的分类 自定义变量&#xff1a; 环境变量&#xff1a; 命令变量与命令行参数&#xff1a; 预定义变量&#xff1a; shell中的…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

接口测试-postman(使用postman测试接口笔记)

一、设置全局变量 1. 点击右上角设置按钮-》打开管理环境窗口-》选择”全局“-》设置变量名称&#xff0c;初始值和当前值设置一样的&#xff0c;放host放拼接的url&#xff0c;key放鉴权那一串字符&#xff0c;然后保存-》去使用全局变量&#xff0c;用{{变量名称}}形式 二、…

Django学习笔记之数据库(一)

文章目录 安装一、数据库配置二、基本操作步骤1.增加2.查看3.排序4.更新5.删除数据 三、一对多&#xff0c;多对多&#xff0c;一对一1.一对多1.一对一1.多对多 四、查询操作五、聚合操作六、F和Q操作 安装 首先就是安装Mysql和Navicat。 一、数据库配置 其实整个就是连接前端…

【工具变量】统计行业锦标赛激励数据集(2008-2023年)

一、数据简介 坚持创新驱动发展&#xff0c;要强化企业创新主体地位&#xff0c;发挥企业家在技术创新中的重要作用。作为企业组织内部最具有影响力的角色&#xff0c;高级管理人员拥有企业经营管理的自由裁量权&#xff0c;对企业战略决策及由此产生的经营绩效具有举足轻重的…

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态&#xff0c;并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中&#xff0c;PRAGMA 是一种编译指示&#xff08;compiler directi…

【QT-QTableView实现鼠标悬浮(hover)行高亮显示+并设置表格样式】

1、自定义委托类 HoverDelegate hoverdelegate.h #ifndef HOVERDELEGATE_H #define HOVERDELEGATE_H#include <QObject> #include <QStyledItemDelegate>class hoverdelegate : public QStyledItemDelegate {Q_OBJECT // 添加 Q_OBJECT 宏public:explicit hoverde…

Improving Language Understanding by Generative Pre-Training GPT-1详细讲解

Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV&#xff1a;ImageNet pre-trained model NLP&#xff1a;pre-trained model? 在计算机视觉中任务包含分类、检测、分割&#xff0c;任务类别数少&#xff0c;对应…

大数据技术 指令笔记1

3.cd命令 cd命令用来切换工作目录至DirName。其中DirName表示法可为绝对路径或相对路径 例如&#xff1a; cd/ 切换到根目录 cd 切换到家目录 cd /etc/sysconfig/ 切换到/etc/sysconfig目录 cd .. 返回到父目录 4.Is命令 Is命令用来列出文件或…

创建Java项目,并添加MyBatis包和驱动包

一 : Mybatis和jsp使用上,只有Dao层有区别 Mybatis 使用方法: 测试类的7步骤 1.读取核心配置文件 2.构建sql会话工厂 3.开启sql会话 4.获取mapper接口 5.调用相对应的增删改查方法 6.打印 7.关闭回话 /*** 用户列表* throws IOException*/Testpublic void roleList() throws IO…

【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…