shardingsphere-分表-按创建日期分表

前提介绍

将your_table_name表按创建时间分表,每半年一张表,分表步骤如下;

因为系统只有这一张表分了表,所以对关联查询影响不大,但是若多张表分表,可能会造成1*n或者n*n的现象;

查询必带分表键,否则会查所有的表

yml配置

需要注意的是

          table-strategy:
            standard:
              sharding-column: create_time
              precise-algorithm-class-name: com.xx.TableShardingStrategy
              range-algorithm-class-name: com.xx.RangeShardingStrategy

actual-data-nodes: 这个配置的数据库.xx是逻辑库default-data-source-name 的名字 
spring:#数据库读写分离分库分表配置shardingsphere:datasource:names: "testdb,testdb-slave"testdb:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.mariadb.jdbc.Driverurl:  username:  password:  connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000filters: statinitialSize: 5maxActive: 200maxWait: 5000maxOpenPreparedStatements: -1minEvictableIdleTimeMillis: 30000timeBetweenEvictionRunsMillis: 20000minIdle: 1logAbandoned: truepoolPreparedStatements: falseremoveAbandoned: trueremoveAbandonedTimeout: 1800testOnBorrow: falsetestOnReturn: falsetestWhileIdle: trueuseGlobalDataSourceStat: truevalidationQuery: SELECT 1 FROM DUALtestdb-slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.mariadb.jdbc.Driverurl: jdbc: username:  password:  connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000filters: statinitialSize: 5maxActive: 200maxWait: 5000maxOpenPreparedStatements: -1minEvictableIdleTimeMillis: 30000timeBetweenEvictionRunsMillis: 20000minIdle: 1logAbandoned: truepoolPreparedStatements: falseremoveAbandoned: trueremoveAbandonedTimeout: 1800testOnBorrow: falsetestOnReturn: falsetestWhileIdle: trueuseGlobalDataSourceStat: truevalidationQuery: SELECT 1 FROM DUALsharding:master-slave-rules: #配置读写分离testdb-r:master-data-source-name: testdbslave-data-source-names: testdb-slavedefault-data-source-name: testdb-rtables:your_table_name:actual-data-nodes: testdb-r.your_table_name_$->{2023..2024}_$->{1..2}table-strategy:standard:sharding-column: create_timeprecise-algorithm-class-name: com.xx.TableShardingStrategyrange-algorithm-class-name: com.xx.RangeShardingStrategyprops:sql:show: true

建表

CREATE TABLE your_table_name_202301 LIKE your_table;
CREATE TABLE your_table_name_202302 LIKE your_table;

CREATE TABLE your_table_name_202401 LIKE your_table;
CREATE TABLE your_table_name_202402 LIKE your_table;
-- 依此类推,创建每年的表

分表算法

配置在了上面的配置类里

public class TableShardingStrategy implements PreciseShardingAlgorithm<LocalDateTime> {@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<LocalDateTime> shardingValue) {LocalDateTime date = shardingValue.getValue();int year = date.getYear();int month = date.getMonthValue();String suffix = (month <= 6) ? "_1" : "_2";String tableName = shardingValue.getLogicTableName() + "_" + year + suffix;if (availableTargetNames.contains(tableName)) {return tableName;}throw new UnsupportedOperationException("Table not found: " + tableName);}
}

范围分片

若时间字段有范围查询的需要用到范围分片,不加的话会报错:

Cannot find range sharding strategy in sharding rule.

配置文件

range-algorithm-class-name: com.xx.RangeShardingStrategy

代码

import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;public class RangeShardingStrategy implements RangeShardingAlgorithm<LocalDate> {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<LocalDate> shardingValue) {String tableNameSufix = shardingValue.getLogicTableName();LocalDate lower = shardingValue.getValueRange().hasLowerBound() ? shardingValue.getValueRange().lowerEndpoint() : LocalDate.of(2023, 1, 1);LocalDate upper = shardingValue.getValueRange().hasUpperBound() ? shardingValue.getValueRange().upperEndpoint() : LocalDate.of(2030, 1, 1);//设置最大最小的上限if(lower.compareTo(LocalDate.of(2023,1,1))<0){lower=LocalDate.of(2023,1,1);}if(upper.compareTo( LocalDate.now().plusMonths(6))>0){upper=LocalDate.now().plusMonths(6);}//把上限设置为年底或年中if(upper.getMonthValue()>6){upper=LocalDate.of(upper.getYear(),12,30);}else{upper=LocalDate.of(upper.getYear(),6,30);}List<String> tableNames = new ArrayList<>();LocalDate current = lower;while (current.isBefore(upper) || current.isEqual(upper)) {tableNames.add(getTableNameByDate(tableNameSufix, current));current = current.plusMonths(6);}return tableNames;}public static String getTableNameByDate(String sufix, LocalDate dateTime) {int year = dateTime.getYear();int month = dateTime.getMonthValue();String suffix = (month <= 6) ? "1" : "2";return sufix + "_" + year + "_" + suffix;}
}

maven

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version>
</dependency>

常见分表的策略

  1. 分表键的选择

    • 唯一性:分表键应该尽量具有唯一性,以避免数据倾斜。
    • 查询频率:选择查询频率较高的字段作为分表键,可以提高查询效率。
    • 业务逻辑:分表键应符合业务逻辑,便于数据的管理和维护。

    常见的分表键有:

    • 用户ID(user_id):适用于用户相关的数据表。
    • 时间戳(timestamp):适用于按时间分表的场景,如日志表
    • 订单ID(order_id):适用于订单相关的数据表。
  2. 分表策略

    • 哈希分表:通过对分表键进行哈希运算,将数据分布到不同的表中。适用于数据量大且需要均匀分布的场景。
    • 范围分表:根据分表键的范围进行分表,如按时间范围分表。适用于数据有明显时间周期的场景。
    • 取模分表:对分表键进行取模运算,将数据分布到不同的表中。适用于数据量较大且需要均匀分布的场景。
  3. 实现方式

    • 手动分表:在代码中手动实现分表逻辑,适用于简单的分表需求。
    • 使用分表中间件:如Sharding-JDBC、MyCat等,可以简化分表的实现过程,适用于复杂的分表需求。

使用时间对比ID分表的优劣

 如果分表键是创建时间而不是ID,会对系统的设计和性能产生一些影响。以下是一些可能的影响:

  1. 数据分布

    • 均匀性:使用创建时间作为分表键,数据可能会集中在某些时间段内,导致某些表的数据量过大,而其他表的数据量较小。这种不均匀的数据分布可能会影响查询性能。
    • 热数据问题:如果系统在某些时间段内有大量数据写入,可能会导致某些表成为“热表”,从而引发性能瓶颈
  2. 查询性能

    • 范围查询:使用创建时间作为分表键,进行时间范围查询时可能会比较方便,因为数据是按时间分布的。
    • 随机查询如果需要根据其他字段(如ID)进行查询,可能需要扫描多个表,增加查询复杂度和时间
  3. 数据管理

    • 归档和清理:使用创建时间作为分表键,可以更方便地进行数据归档和清理操作。例如,可以按时间段删除过期数据。
    • 扩展性如果数据量持续增长,可以按时间段创建新的表,扩展性较好

分表后多表关联的配置

1.这里的绑定表也叫关联表。指分片规则一致的主表和子表。例如: order 表和  order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系

2.简单举例,需要关联的表加上这个配置

 binding-tables:
        - order, order_item

spring:shardingsphere:datasource:names: ds0, ds1ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/demo_ds_0username: rootpassword: passwordds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/demo_ds_1username: rootpassword: passwordsharding:tables:order:actual-data-nodes: ds$->{0..1}.order_$->{0..1}table-strategy:inline:sharding-column: order_idalgorithm-expression: order_$->{order_id % 2}order_item:actual-data-nodes: ds$->{0..1}.order_item_$->{0..1}table-strategy:inline:sharding-column: order_idalgorithm-expression: order_item_$->{order_id % 2}binding-tables:- order, order_itemdefault-database-strategy:inline:sharding-column: user_idalgorithm-expression: ds$->{user_id % 2}

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

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

相关文章

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的&#xff1f;在文章开头我们提出这个疑问&#xff0c;带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容&#xff0c;在日常App 中非常常见&#xff0c;比如微博的发布与展示&#xff0c;朋友圈的发布与展示&#xff0c;都在使用富文…

LeetCode_231. 2 的幂_java

1、题目 231. 2 的幂https://leetcode.cn/problems/power-of-two/ 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n &#xff0c;则认为 n 是 2 的幂次方…

ComfyUI初体验

ComfyUI 我就不过多介绍了&#xff0c;安装和基础使用可以看下面大佬的视频&#xff0c;感觉自己靠图文描述的效果不一定好&#xff0c;大家看视频比较方便。 ComfyUI全球爆红&#xff0c;AI绘画进入“工作流时代”&#xff1f;做最好懂的Comfy UI入门教程&#xff1a;Stable D…

ArcGIS001:ArcGIS10.2安装教程

摘要&#xff1a;本文详细介绍arcgis10.2的安装、破解、汉化过程。 一、软件下载 安装包链接&#xff1a;https://pan.baidu.com/s/1T3UJ7t_ELZ73TH2wGOcfpg?pwd08zk 提取码&#xff1a;08zk 二、安装NET Framework 3.5 双击打开控制面板&#xff0c;点击【卸载程序】&…

dbt-codegen: dbt自动生成模板代码

dbt项目采用工程化思维&#xff0c;数据模型分层实现&#xff0c;支持描述模型文档和测试&#xff0c;非常适合大型数据工程项目。但也需要用户编写大量yaml描述文件&#xff0c;这个过程非常容易出错且无聊。主要表现&#xff1a; 手工为dbt模型编写yaml文件&#xff0c;这过…

STM32传感器模块编程实践(十一) ADC模数转换模块ADS1115简介及驱动源码

文章目录 一.概要二.ADS1115芯片介绍三.ADS1115芯片主要特性四.ADS1115模块接线说明五.ADS1115参考原理图六.通讯协议介绍七.STM32单片机与ADS1115模块实现电压采集实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.源代码工程下载九.小结 一.概要 ADC&#xff0c;全称为…

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档&#xff1a;https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下&#xff1a; {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…

JavaScript完整笔记

JS引入 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有两种方式&#xff1a; 内部方式 通过 script 标签包裹 JavaScript 代码 我们将 &…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

如何快速解决游戏提示系统中的emp.dll缺失问题

emp.dll是一个动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件&#xff0c;这类文件在Windows操作系统中扮演着至关重要的角色。它们包含了可由多个程序同时使用的代码和数据&#xff0c;其主要目的是实现模块化&#xff0c;以便于程序的更新和动态链接。emp…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步&#xff1a;下载zip包&#xff0c;并解压缩 第二步&#xff1a;去docker找到es-plugins数据卷挂载的位置&#xff0c;并进入这个目录 第三步&#xff1a;把拼音分词器的安装包拖到这个目录下 第四步&#xff1a;重启es 第…

RV1126音视频学习(二)-----VI模块

文章目录 前言2.RV1126的视频输入vi模块2.1什么是VI模块2.3RV1126VI模块主要APIRK_MPI_SYS_Init()RK_MPI_VI_SetChnAttrRK_MPI_VI_EnableChnRK_S32 RK_MPI_VI_DisableChnRK_MPI_VI_StartStreamRK_MPI_SYS_GetMediaBufferRK_MPI_MB_GetPtrRK_MPI_MB_GetSizeRK_MPI_MB_ReleaseBuf…

【NOIP提高组】加分二叉树

【NOIP提高组】加分二叉树 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 设一个n个节点的二叉树tree的中序遍历为&#xff08;l,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整…

读《认知觉醒》:浅谈费曼技巧

最近在阅读《认知觉醒》这本书&#xff0c;封面如下&#xff1a; 读到了里面对于费曼技巧的介绍&#xff08;在第八章&#xff09;&#xff0c;感觉受到了一些启发&#xff0c;在这里分享给大家。 其实之前很早就接触过了费曼技巧&#xff0c;但是并没有很好的应用起来&#x…

零代码快速开发智能体 |甘肃旅游通

零代码快速开发智能体 &#xff5c;甘肃旅游通 本文仅用于文心智能体的活动征文 参与人&#xff1a;mengbei_admin 文心智能体平台是人工智能领域的佼佼者。它拥有强大的语言理解与生成能力&#xff0c;能精准回应各种问题&#xff0c;出色完成文本创作、知识问答和翻译等任…

线性表之双向链表

链表花里胡哨&#xff0c;一应俱全 前言 在这之前&#xff0c;我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去&#xff0c;有时&#xff0c;我们想要查找某个结点的时候还得从头开始遍历查找&#xff0c;尽管我们已经学习了顺序表&#xff0c;查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明&#xff1a;PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…