使用ShardingSphere实现MySql的分库分表
目录
一 什么是ShardingSphere分库分表
二 代码实现
1.导入相关依赖
2.配置相关参数
3.创建学生类以及mapper接口
4.实现 StandardShardingAlgorithm接口自定义分片算法
唐洋洋我知道你在看!!!嘿嘿
一 什么是ShardingSphere分库分表
我们平时在设计数据库的时候,一般都是一个数据库里面有很多张表,比如用户表,那么所有的用户信息都会存在这一张表里面。但是当数据量特别大的时候,如果你只用一个数据库一张用户表来存,这样就会到这这个数据库访问压力过大。所以分库分表就是,把大量用户数据分成多个数据库的多张表来存,这里以学生信息表为例:

可以看到,我创建了两个数据库,每个数据库分别有两张表来存储学生信息,这样相当于一共有四张学生表了,这样就能减少每个数据库的访问压力。
既然分库分表的意思明白了,那么我们查询或者插入学生表的时候,该怎么操作呢?比如我现在要存入一个学生信息,我该往哪个表存呢?那么这里肯定是通过计算出来的,而且是某种算法,整体要平均。
所以这就是我们ShardingSphere的作用。
二 代码实现
1.导入相关依赖
<!-- shardingsphere依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.3.2</version><exclusions><exclusion><artifactId>snakeyaml</artifactId><groupId>org.yaml</groupId></exclusion></exclusions></dependency><!-- 坑爹的版本冲突 --><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.26</version></dependency>
2.配置相关参数
application.yml参数:

spring:datasource:driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriverurl: jdbc:shardingsphere:classpath:shardingsphere-config.yaml
shardingsphere-config.yaml参数:

dataSources:student_0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/student_0?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 1234student_1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/student_1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 1234
rules:- !SHARDING #分片规则tables:tb_student: #逻辑表名actualDataNodes: student_${0..1}.t_student_${0..3}databaseStrategy: # 分库策略standard: # 用于单分片键的标准分片场景shardingColumn: id # 分片列名称shardingAlgorithmName: db_hash_mode_algorithm # 分片算法名称tableStrategy: # 分表策略,同分库策略standard: # 用于单分片键的标准分片场景shardingColumn: id # 分片列名称shardingAlgorithmName: tb_student_hash_mode_algorithm # 分片算法名称# 分片算法配置shardingAlgorithms:db_hash_mode_algorithm:type: CLASS_BASED # 分片算法类型 自定义props: # 分片算法属性配置db_sharding-count: 2table_sharding-count: 4strategy: standard #标准的分片算法algorithmClassName: com.feisi.shardingsphere.MyStandardShardingAlgorithmtb_student_hash_mode_algorithm:type: HASH_MODprops:sharding-count: 4
props:sql-show: true
3.创建学生类以及mapper接口

学生类:
package com.feisi.shardingsphere.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import org.springframework.stereotype.Component;@Data
@TableName("tb_student")
@Builder
@Component
public class Student {@TableId(type = IdType.INPUT)private Long id; //分片键private String name;private Integer age;
}
学生mapper接口:
package com.feisi.shardingsphere.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.feisi.shardingsphere.pojo.Student;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
4.实现 StandardShardingAlgorithm接口自定义分片算法
package com.feisi.shardingsphere;import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.sharding.algorithm.sharding.ShardingAutoTableAlgorithmUtil;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;import java.util.Collection;
import java.util.Optional;
import java.util.Properties;public class MyStandardShardingAlgorithm implements StandardShardingAlgorithm<Comparable<?>> {// 数据库的数量配置参数名private static final String DB_SHARDING_COUNT_KEY = "db_sharding-count";// 表的数量配置参数名private static final String TABLE_SHARDING_COUNT_KEY = "table_sharding-count";private int dbShardingCount;private int tableShardingCount;@Overridepublic void init(final Properties props) {dbShardingCount = getDbShardingCount(props);tableShardingCount = getTableShardingCount(props);}private int getTableShardingCount(Properties props) {ShardingSpherePreconditions.checkState(props.containsKey(TABLE_SHARDING_COUNT_KEY), () -> new ShardingAlgorithmInitializationException(getType(), "Sharding count cannot be null."));return Integer.parseInt(props.getProperty(TABLE_SHARDING_COUNT_KEY));}private int getDbShardingCount(Properties props) {ShardingSpherePreconditions.checkState(props.containsKey(DB_SHARDING_COUNT_KEY), () -> new ShardingAlgorithmInitializationException(getType(), "Sharding count cannot be null."));return Integer.parseInt(props.getProperty(DB_SHARDING_COUNT_KEY));}@Override//availableTargetNames: ds_${0..1}: ds_0 ds_1public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Comparable<?>> shardingValue) {//id进行hash 数据库数量 2 表的数量 4
// 这里使用哈希取余的算法// hash % 4 = 0..3 /2 0,1 /2 = 0 2,3/2 = 1String suffix = String.valueOf(hashShardingValue(shardingValue.getValue()) % tableShardingCount / dbShardingCount);return ShardingAutoTableAlgorithmUtil.findMatchedTargetName(availableTargetNames, suffix, shardingValue.getDataNodeInfo()).orElse(null);}@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Comparable<?>> shardingValue) {return availableTargetNames;}//对分片键的值进行hash算法private long hashShardingValue(final Object shardingValue) {return Math.abs((long) shardingValue.hashCode());}@Overridepublic String getType() {return "CLASS_BASED";}}
这里自定义分片算法在dosharding方法里面,分片算法的意思就是,根据你的分片建通过算法确定你的学生信息存储到哪个数据库中的哪张表里面去。
这里使用的是哈希取余算法,先根据你的分片键(这里的分片键就是id),计算出它的哈希值,然后:
哈希值%你的数据表的数量=要存的哪块表
要存的哪块表%你的数据库的数量=要存在哪个库里面。
为什么公式是这样的,因为我们的每个库从0开始,每个库对应下面的表也是从0开始。所以这个公式就能算出来。
比如一个id的哈希值是:448488114
我们的库数量是2个(0,1)
表数量是4个(0,1,2,3)
那么:448488114%4=2(存在表2里面)
但是表2在数据库1下面,所以你的算法不能算错,如果算到0库,那么就找不到这个张表了。
2/2=1(数据库1)
这样就完成了,最后算到你这个学生信息应该存到数据库1下面的数据表2中。
相关文章:
使用ShardingSphere实现MySql的分库分表
目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候…...
为什么 Feign 要用 HTTP 而不是 RPC?
一、引言 在现代微服务架构中,服务之间的通信是至关重要的环节。Feign 是一种常用的声明式 HTTP 客户端工具,它简化了服务间的调用过程。然而,在服务通信的领域中,除了基于 HTTP 的方式,还有 RPC(Remote Pr…...
OJ在线评测系统 前端开发设计优化通用菜单组件二 调试用户自动登录
通用的菜单组件开发二 接下来要完善 权限功能 就是只有登录后才能进入题目查看界面 用户只能看到我们有权限的菜单 我们要在路由文件里面去操作 原理是控制路由设置隐藏 只要用户没有权限 就过滤掉隐藏 全局权限管理 实现想清楚有那些权限 /*** 权限定义*/ const ACCES…...
mongodb 安装教程
mongodb 安装教程: https://blog.51cto.com/u_13646338/5449015 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.9.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.9.tgz -C /opt/module/ [roothadoop102 module]# mv mongodb-linux-…...
切换淘宝最新镜像源npm
要切换淘宝的npm镜像源,可以按照以下步骤进行: 1. 打开命令行工具(如Terminal、CMD等)。 2. 输入以下命令来查看当前的npm镜像源: npm config get registry 3. 如果当前的镜像源不是淘宝镜像源ÿ…...
SpringAI-基于java大模型的胡言乱语
最近看了一点相关的springAI知识,做个小总结 胡言乱语开始 1.不同的ai调用api一般单独汇总成一个依赖,比如说调用openai的api的依赖是spring-ai-openai-spring-boot-starter。 2.最常用的展示方式是流式对话,AI的数据是一个字一个字生成的…...
python提问及解析
在看答案之前,可以先试试自己做哦! 1.图书馆借书还书系统 问题描述 问题:设计一个Python程序,该程序模拟一个大型图书馆的图书管理系统。图书馆拥有成千上万的书籍,每本书都有一个唯一的ISBN号、书名、作者、出版年份…...
从Apple Intelligence到IoT Intelligence,端侧生成式AI时代加速到来
9月10日凌晨1点,苹果新品发布会如期举行,全新iPhone16系列成为苹果生态中真正意义上的第一款原生AI手机,在第二代3nm工艺A18和A18 Pro芯片的加持下,iPhone16系列能够容纳并快速运行以Apple Intelligence为中心的生成式AI功能在手机…...
智能AC管理系统HTTPD-AC 1.0服务存在未授权访问漏洞
@[toc] 智能AC管理系统HTTPD-AC 1.0服务存在未授权访问漏洞 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途…...
Sidewalk介绍
目录 1 前言2 简介2.1 注意事项 3 结束语 1 前言 Sidewalk是Amazon出的一个针对IoT物联网的协议,类似于LoRaWAN协议,针对小而美的低功耗设备。Amazon Sidewalk支持低带宽和远程连接,使用BLE进行短距离通信,使用900MHz的频率的LoR…...
Java数据结构 (泛型第二节) 泛型擦除机制/泛型的限制/上界下界
书接上回:Java数据结构 (泛型第一节) 为什么要有泛型/泛型语法/泛型方法-CSDN博客 访问作者Github: https://github.com/Joeysoda/Github_java/blob/main/20240908%E6%B3%9B%E5%9E%8B/src/%E6%B3%9B%E5%9E%8B.java 目录 1. 为什么要有擦除机制? 2. 类…...
数据安全标准在非结构化数据中台的遵守
在数字化转型的浪潮中,非结构化数据中台作为企业数据管理的核心枢纽,承载着海量且多样的数据资产。这些数据不仅关乎企业的运营决策,更涉及客户隐私、商业机密等敏感信息。因此,确保非结构化数据中台遵守数据安全标准,…...
探索Go语言中的Goroutine并发机制
什么是Goroutine 在Go语言中,Goroutine 是程序中最基本的并发单位。事实上,每个Go程序都会自动创建一个goroutine,那就是主goroutine,程序启动时会立即执行。Goroutine是Go语言中处理并发问题的核心工具,因此理解它的工作原理至关重要。 简而言之,Goroutine是并发执行的…...
实现实时Web应用,使用AJAX轮询、WebSocket、还是SSE呢??
文章目录 短轮询(Short Polling)长轮询(Long Polling)Comet “服务器推” (这玩意现在用的很少了,了解一下即可)WebSocket原理:方法:事件: SSE原理事件 总结 …...
3GPP协议入门——物理层基础(一)
1. 频段/带宽 NR指定了两个频率范围,FR1:通常称Sub 6GHz,也称低频5G;FR2:通常称毫米波(Millimeter Wave),也称高频5G。 2. 子载波间隔 NR中有15kHz,30kHz,6…...
关于Java数据结构中集合的一个小知识
在我们以后刷题的过程,我们会遇到一些奇怪的集合数据类型。 如下图 这里,我们以顺序表的集合类为例,我们看到上图函数的返回值类型有点奇怪,其实并不奇怪,也就是穿过去的参数类型是一个顺序表的集合类型,也…...
leetcode41. 缺失的第一个正数,原地哈希表
leetcode41. 缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释…...
如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理)
如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理) 目录 收起 1 前言 1.1 自身经历 1.2 教师资格证的作用 2 知识点题型分数的分布与学习建议 2.1 科目三的知识点分数分布: …...
3.数据类型
作业系统链接 Python 是一门面向对象友好的语言,支持多种内置数据类型,包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list&am…...
Xcode报错:No exact matches in reference to static method ‘buildExpression‘
Xcode报错1:No exact matches in reference to static method buildExpression Xcode报错2:Type () cannot conform to View 这两个报错都是因为在SwiftUI的View的Body里面使用了ForEach循环,却没有在ForEach循环闭包的内部返回视图,而是做了…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
