如何进行分表?数据归档和正常分表有区别吗?

分表技术选型

分别常见的主要考虑2种分表方案:Sharding-JDBC 、利用Mybatis自带的拦截器特性。

  1. JAVA生态中很常用的分表框架是Sharding-JDBC ,虽然功能强大,但需要一定的接入成本,并且很多功能暂时用不上。

  2. 如果系统本身已经在使用Mybatis了,只需要添加一个mybaits拦截器,把SQL表名替换为新的周期表就可以了,没有接入新框架的成本,开发成本也不高。

分表方案总结

  • 方案一

    通过Sharding-JDBC,基于字段Hash取余进行动态路由

properties 复制代码
# 配置真实数据源
spring.shardingsphere.datasource.names=server-order0,server-order1

# 配置第 1 个数据源
spring.shardingsphere.datasource.server-order0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order0.jdbc-url=jdbc:mysql://111.230.25.88:3301/db_order
spring.shardingsphere.datasource.server-order0.username=root
spring.shardingsphere.datasource.server-order0.password=lisirui.

# 配置第 2 个数据源
spring.shardingsphere.datasource.server-order1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order1.jdbc-url=jdbc:mysql://111.230.25.88:3302/db_order
spring.shardingsphere.datasource.server-order1.username=root
spring.shardingsphere.datasource.server-order1.password=lisirui.

# 标准分片表配置(数据节点)
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order$->{0..1}.t_order$->{0..1}
# 分片列名称 根据 user_id 进行分表
spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.standard.sharding-column=user_id
...
  • 方案二

    通过Mybatis拦截器,动态新增新表

  • 怎么设计表后缀呢?还是这样1,2,3路由?

    比如说,我们的业务特性是查最近的一月的数据,按日期的水平拆分是合理的。每月生成一张新表,同时此表只放本月的数据,这样表内数据量得到了控制,不会很大。

  • 通过拦截器获取表名
ini 复制代码
String tableName = TemplateMatchService.matchTableName(boundSql.getSql().trim());
  • 根据数据日期进行计算后缀,替换原有 sql,最终执行。
ini 复制代码
 String rebuildSql = boundSql.getSql().replace(shardingProperty.getTableName(), shardingTable);
 metaStatementHandler.setValue(ORIGIN_BOUND_SQL, rebuildSql);

不用分库分表怎么解决

归档/删除旧数据

这种方式最常见的方案就是将冷数据移动到归档表或者直接进行删除,从而减少表的大小。

实现思路非常简单,一般写一个定时任务不断的跑就可以了。

  • 删除数据的缺点

1、数据删除会影响数据库性能,引发慢sql,多张表并行删除,数据库压力会更大。

2、频繁删除数据,会产生数据库碎片,影响数据库性能,引发慢SQL。

  • 数据归档场景举例

以上述场景为例子,有个地方会产生告警事件,随着业务的增长,告警事件表里的数据肯定会越来越多,势必会对查询造成压力,这时候就可以对告警产生了一段时间的数据进行归档,即将这部分数据备份到其他表里面。其实到这一步,数据归档其实跟分表无异,只不过一个是往新表写新数据,一个是往新表写旧数据。

  • 数据归档的优点

可以由程序员手动控制归档时机,上面的分表的例子就是每个月自动生成一张新表(看具体业务),如果业务不一定每个月都有那么大数据量的话是没有必要每个月都生成一张新表的,可以定期观察数据库的数据量,再决定是否需要创建新表。

相关推荐
一切皆是因缘际会3 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
小码哥_常4 小时前
告别MySQL!大厂集体转投PostgreSQL,到底藏着什么玄机?
后端
刀法如飞5 小时前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
swipe6 小时前
别再把 AI 聊天做成纯文本:从 agui 这个前后端项目,拆解“可感知工具调用”的流式 AI UI
后端·langchain·llm
GetcharZp6 小时前
GitHub 爆火!纯 Go 编写的文件同步神器 Syncthing,凭什么成为程序员的标配?
后端
hERS EOUS6 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
LucianaiB6 小时前
我用飞书多维表做了一个 AI 活动推荐智能体:每天自动催我别错过截止日期!
后端
TheRouter7 小时前
Agent Harness系列(三):记忆层的3种持久化架构——从SQLite到向量库
人工智能·架构·sqlite·llm·ai-native
一切皆是因缘际会7 小时前
从概率生成到内生心智:2026大模型瓶颈与下一代AI演进方向
人工智能·安全·ai·架构