MySql分表设计,Java分表设计

news/2024/7/24 11:52:52 标签: mysql, 数据库, 分表, mysql分表, java分表

文章目录

      • 一、前言
        • 1-1、什么时候需要分表呢?
        • 1-2、分表的规则是什么呢?
          • 1-2-1、分表前后
          • 1-2-2、其它
      • 二、举例场景
      • 三、实现分表功能
        • 3-1、数据的增删改
        • 3-2、数据的查询
        • 3-3、自动创建表
        • 3-4、其它

一、前言

1-1、什么时候需要分表呢?

这个其实就很简单了,就是当表数据太大的时候,一个表里面存储不下,或者存储后影响使用(比如数据多的时候就影响查询效率)


1-2、分表的规则是什么呢?

一般来说我们都是根据数据量来分表的,数据存储是为了后面使用,所以我们表名也应该清楚明了。

我们可以根据数据量分为、天、月、年 (当然了,还可以细分,但是逻辑会相对复杂一些,原理都一样)


1-2-1、分表前后

这里以月和年进行举例

之前的表名之后的表名
pub_send_messagepub_send_message_2021_03
pub_send_message_batchpub_send_message_batch_2021

其实也很简单,就是在之前的表名后面加上规则。


1-2-2、其它

这里有有趣的事情

  • 我:你看看这样命名有没问没? pub_send_message_21_03
  • 大佬:小了,格局小了,你们公司难道不能存活80年以上嘛?

二、举例场景

这里举例一个短信中台的业务场景。

短信的发送1V1和1VN,也就是一条短信发送给一个人,一条短信发送给多个人。

每一条短信都是要先存到数据库,为了后面追溯,所以需要一个短信明细表,一个短信批次表。


三、实现分表功能


3-1、数据的增删改

之前我们插入数据的时候只需要写下面的sql

INSERT INTO pub_send_message (id,mobile) VALUES(#{id},#{mobile});

而现在的话,因为我们的表是按照月份区分的,所以再插入的时候我们需要明确我们的表名。

我们获取到当前年、月的时候,传递过去就好了,所以我们的sql改成这样。

INSERT INTO pub_send_message_${year}_${month} (id,mobile) VALUES(#{id},#{mobile});

注:这里需要区分一下 $ 和#的区别,$是字符串拼接,#是带引号的拼接。


3-2、数据的查询

因为我们查询的数据可能存在多张表里面,这样就很难的查询了。

  • 上面我们是按照月来区分的,所以我们可以规定一下,我们只查询本月数据
  • 我们可以规定下只查询近3个月的数据,这样我们可以使用union连接查询
  • 如果要以某个维度查询全部的数据,那么建议以这个维度建立一个报表(不可能全部的数据去union的)

3-3、自动创建表

比如上面的这个pub_send_message_2021_03表,每个月都会产生一张,我们不可能每个月自己去建,一来这样很麻烦,二来如果忘记了系统就会异常,所以我们要写一个定时任务或者脚本去自动生成表。


MySql查看表是否存在

  • work_order 数据库
  • css_work_order_21表名
SELECT
	count(*) 
FROM
	information_schema.TABLES t 
WHERE
	t.TABLE_SCHEMA = 'work_order' 
	AND t.TABLE_NAME = 'css_work_order_21'

建表语句就不说了,Java定时任务或脚本见表也不说了


3-4、其它

这里说一个小的设计思路

如果我们之前的代码是这样写的

void add(PubSendMessage pubSendMessage);

<select id="add" parameterType="com.koron.mgdevops.shortmessage.bean.PubSendMessage">
    INSERT INTO pub_send_message (id,mobile) VALUES(#{id},#{mobile});
</select>

现在我们的操作都是要多传入yearmonth两个参数

方法一

void add(@Param("bean") PubSendMessage pubSendMessage,@Param("year") String year,@Param("month") String month);

<select id="add" parameterType="com.koron.mgdevops.shortmessage.bean.PubSendMessage">
    INSERT INTO pub_send_message_${year}_${month} (id,mobile) VALUES(#{bean.id},#{bean.mobile});
</select>

方法二

先让我们的PubSendMessage去继承一个新的实体,这样我们其它的接口和xml都不需要改变了

public  class PubSendMessage  extends TestBean2{}
public class TestBean2  {

    private String year;

    private String month;


    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }
}

http://www.niftyadmin.cn/n/774912.html

相关文章

MySql关键字GROUP_CONCAT,组合连接查询

一、 试着想一下如果有这样一个需求应该怎么去做: 有一张学生表&#xff0c;和一张分数表。要查出每个学生姓名和分数&#xff0c;分数以逗号隔开 eg&#xff1a;张三 80,90,100 这个需求很简单&#xff0c;有很多种办法来解决&#xff0c;最简单的是我们可以先查询学生&#x…

MySql分组查询规则

文章目录一、问题二、结论证明实验一实验二一、问题 思考一下假如你有一个这样的需求 有一张账单表&#xff08;bill_detail&#xff09;&#xff0c;一张开票表&#xff08;open_invoice&#xff09; 每一个用户有三种费用类型&#xff0c;分别是水费、污水费、违约金。&…

Nginx负载均衡当其中一台服务器挂掉之后,Nginx负载将会怎样呢?

之前写过Nginx负载均衡的配置&#xff0c;详情可以看这里 Nginx实现负载均衡Linux版本&#xff08;六种负载策略&#xff09; 今天来探讨一下当我们有多台服务的时候&#xff0c;其中一台服务挂掉了会怎么样呢&#xff1f; 我们使用上文中的思路去搭建一个简单的负载均衡&…

SpringCloud微服务详解(springcloud alibaba)

文章目录一、前言二、架构图三、过程详解3-1、服务的调用方3-2、负载均衡&#xff08;Nginx&#xff09;3-3、网关3-4、注册中心3-5、服务负载均衡调用3-6、服务提供方3-7、服务熔断、降级、限流、监控3-7-1、熔断3-7-2、降级3-7-3、限流3-7-4、监控3-8、统一配置文件3-9、分布…

Java进阶之单点登录详解

之前对单点系统这几个字还挺敬畏的&#xff0c;也有点害怕&#xff0c;来公司很久了系统也一直使用单点登录&#xff0c;但是一直没有时间和机会研究&#xff0c;近来研究一下发现不过尔尔。 文章目录一、前言1-1、何为单点1-2、架构图1-3、其它二、单点详解2-1、用户请求2-2、…

IDEA查看历史记录【文件历史和项目历史】

有时候我们写代码发现修改之前的代码才是正确的&#xff0c;如果重写又感觉麻烦&#xff0c;我们可以使用IDEA工具查看文件历史版本 最近因为GIT冲突&#xff0c;导致我还没上传的文件没了&#xff0c;这时候我们可以查看项目的历史记录&#xff0c;然后恢复。

全新的ORM框架——BeetlSQL介绍

阅读本文大概需要 1.8 分钟。 最近入职这家公司的ORM框架不是用MyBatis、Hibernate、也不是JPA&#xff0c;而是一个叫做BeetlSQL的框架。这篇文章不是对这个框架的讲解&#xff08;觉得没必要&#xff0c;后面会说&#xff09;&#xff0c;而是对它的一个简介和这一周来使用的…

MySQL之explain关键字详解

本文转自&#xff1a; https://segmentfault.com/a/1190000021458117?utm_sourcetag-newest https://www.cnblogs.com/tufujie/p/9413852.html 文章目录一、开始二、字段含义2-1、id2-2、select_type2-3、table2-4、partitions2-5、type2-6、possible_keys2-7、key2-8、key_…