mysql年月分表_MySQL 按日期分表

article/2025/10/27 16:32:48

一、表不存在时则创建

之前做项目实在是太赶了,很多东西都没记录。是时候补回来了

MySQL做一个大表,由于要存历史记录,所以数据量很大,查询很慢。恰好查询的时候,又不需要时间太久的冷数据。现在将其实现原理提取成一个控制台小程序。

首先,创建一个简单的数据库访问类。

public static classCommonDao

{private static MySqlConnection conn = new MySqlConnection(ConfigurationManager.AppSettings["DB"]); //创建连接

///

///Insert Update Delete语句的执行///

/// SQL语句

/// 返回影响行数

public static int ExecuteNonQuerySQL(stringSQL)

{

MySqlCommand cmd=conn.CreateCommand();

cmd.CommandText=SQL;if (conn.State !=ConnectionState.Open)

{

conn.Open();

}int Count =cmd.ExecuteNonQuery();

conn.Close();returnCount;

}

}

由于是按分钟分表,所以写个定时器,每一分钟往里面插入5条数据:

static void Main(string[] args)

{//每分钟执行一次,插入5条数据

Timer t = new Timer(60000);

t.Enabled= true; //到达时间就执行一次,或者是持续执行

t.AutoReset = true; //一直执行

t.Elapsed+= (sender, eea) =>{for (int i = 0; i < 5; i++)

{

DateTime dt=DateTime.Now;string TableName = "person" + dt.ToString("yyyyMMddHHmm");string sql = "INSERT INTO" + TableName + "VALUES(null,'superman','" + dt.ToString("yyyy-MM-dd HH:mm:ss") + "')";try{

CommonDao.ExecuteNonQuerySQL(sql);

}catch(Exception e)

{

MySqlException ex= e asMySqlException;//1146的代号就是表不存在的错误

if (ex.Number == 1146)

{//如果表不存在,则先创建这个表

string SQLCreateTable = "CREATE TABLE" + TableName + "LIKE person"; //从模板表来创建新表,这样的好处是索引、自增什么的可以一次性建好

CommonDao.ExecuteNonQuerySQL(SQLCreateTable);

}

}

}

};

Console.ReadKey();

}

第一张Person模板表的格式如下:

CREATE TABLE`person` (

`Id`int(11) NOT NULLAUTO_INCREMENT,

`Name`varchar(255) DEFAULT NULL,

`OperateTime`datetime DEFAULT NULL,PRIMARY KEY(`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ac8e694a7297a887105fd6df87676423.png

于是就每分钟都会创建表并添加数据。

2f3a42d2f9accfc58d9958642a490962.png

二、分表后跨表查询的问题

分表后有很多问题要处理,简单做两个,maybe会有其他问题。

1、数据在哪个表里;

2、数据跨表了,那么就需要表连接;

通常对这种大表,都肯定要加时间的了,所以要根据时间来判断查哪张表和如何表连接。

增加一个查询的方法:

///

///根据SQL语句查询DataTable///

/// SQL语句

/// 返回DataTable

public static DataTable GetDataTableBySQL(stringSQL)

{

DataSet ds= newDataSet();

MySqlDataAdapter Msda= newMySqlDataAdapter(SQL, conn);

Msda.Fill(ds);

DataTable dt= newDataTable();if (ds.Tables.Count > 0)

{

dt= ds.Tables[0];

}returndt;

}

数据定位的方法:

public static stringGetTableName(DateTime dtStart, DateTime dtEnd)

{if(dtStart.ToString("yyyyMMddHHmm") == dtEnd.ToString("yyyyMMddHHmm"))

{return "person" + dtStart.ToString("yyyyMMddHHmm");

}else{string TableName = "(SELECT * FROM person" + dtStart.ToString("yyyyMMddHHmm");

DateTime dt= dtStart.AddMinutes(1);while(dt.ToString("yyyyMMddHHmm") != dtEnd.ToString("yyyyMMddHHmm"))

{

TableName+= "UNION ALL SELECT * FROM person" + dt.ToString("yyyyMMddHHmm");

dt= dt.AddMinutes(1);

}

TableName+= "UNION ALL SELECT * FROM person" + dt.ToString("yyyyMMddHHmm") + ") AS T";returnTableName;

}

}

测试查询:

string sql = "SELECT * FROM" + GetTableName(Convert.ToDateTime("2016-04-21 17:54:00"),Convert.ToDateTime("2016-04-21 17:56:00"));

DataTable dt=CommonDao.GetDataTableBySQL(sql);foreach(DataRow dr indt.Rows)

{

Console.WriteLine(dr[0] + " " + dr[1] + " " + dr[2]);

}

结果如下:

81dadb3490a2437abf2054335e670e40.png

很明显上面的代码暴露出了一个问题,ID重复了。

本处提供的可选解决方案是。

1、ID使用GUID。

2、自增数字的前面加上表名的日期前缀,如,如果你是按月分表,自增Id设置long类型,然后起止值设置为"201604000000000000000 + Id"。这样就不会重复啦。

自定数字的方式只需多执行以下一条SQL语句:

ALTER TABLE person201604211757 AUTO_INCREMENT=2016042100;

然后生成的ID列的值如下:

e77c1f9f17b24a82b8587d93ac0512c0.png

简单示例就是如此


http://chatgpt.dhexx.cn/article/m85OcVMT.shtml

相关文章

ShardingJdbc分表

ShardingJdbc分表 前言一、ShardingJdbc分表1.引入maven依赖2.yml配置2.分表功能测试 总结 前言 ShardingJdbc官网 下载链接 快速入门 官网原话&#xff1a; Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈&#xff0c;它由 JDBC、Proxy 和 Sidecar&…

Java如何实现分库分表

一、为啥要分库分表 在大型互联网系统中&#xff0c;大部分都会选择mysql作为业务数据存储。一般来说&#xff0c;mysql单表行数超过500万行或者单表容量超过2GB&#xff0c;查询效率就会随着数据量的增长而下降。这个时候&#xff0c;就需要对表进行拆分。 那么应该怎么拆分…

mysql 垂直分表 设计_水平分表和垂直分表

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、…

ShardingSphere分库分表

ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生&#xff0c;最初就叫ShardingJDBC。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c;带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多…

mysql innodb分表技术_mysql分表技术

一般来说&#xff0c;当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了&#xff0c;这次我来详细说说分表的一些方法。 目前我所知道的方法都是MYISAM的&#xff0c;INNODB如何做分表并且保留事务和外键&#xff0c;我还不是很了解。 首先&#xff0c;我们需…

mybatis实现分表

分析上面登陆&#xff0c;当前表按照年份分表了&#xff0c;最大的一张表超过500w建议分表 注意:之前写的经过多方测试发现遍历的时候参数传递不进去&#xff0c;现如今已经完善 package org.jeecg.config.mybatis;import lombok.extern.slf4j.Slf4j; import org.apache.ibati…

mysql 分表条件_mysql分表详解

本人混迹qq群2年多了&#xff0c;经常听到有人说“数据表太大了&#xff0c;需要分表”&#xff0c;“xxxx了&#xff0c;要分表”的言论&#xff0c;那么&#xff0c;到底为什么要分表&#xff1f; 难道数据量大就要分表&#xff1f; mysql数据量对索引的影响 本人mysql版本为…

ShardingSphere简介与分表使用

一、ShardingSphere简介 1、简介 ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。 ShardingSphere 是一套开源的分布式数据库中间件解决方案。 ShardingSphere 产品定位为 Database Plus&#xff0c;旨在构建异构数据库上层的标准和生态圈。 它…

mysql mybatis分表查询_mybatis 自动分表

参考: 相关源码已上传至我的 github 欢迎转载,转载请注明出处,尊重作者劳动成果:https://www.cnblogs.com/li-mzx/p/9963312.html 前言 小弟才疏学浅,可能很多问题也没有考虑到,权当抛砖引玉,希望各位大神指点 项目背景: 希望做一个功能,能在sql操作数据库时,根据某个…

mysql 分区分表_mysql分库分区分表

一、分表 分表分为水平分表和垂直分表。 水平分表原理&#xff1a; 分表策略通常是用户ID取模&#xff0c;如果不是整数&#xff0c;可以首先将其进行hash获取到整。 水平分表遇到的问题&#xff1a; 1. 跨表直接连接查询无法进行 2. 我们需要统计数据的时候 3. 如果数据…

Mock平台介绍

Mock平台可以用来模拟接口&#xff0c;具备了get方法&#xff0c;post方法&#xff0c;header&#xff0c;cookie&#xff0c;重定向等功能。 Mock平台的搭建应用于mock框架&#xff0c;在github上可以下载到开源的代码。 下载地址&#xff1a;http://repo1.maven.org/maven2/…

Mock 框架 Moq 的使用

Intro# Moq 是 .NET 中一个很流vb.net教程行的 Mock 框架&#xff0c;使c#教程用 Mock 框架我python基础教程们可以只针对我java基础教程们关注的代码进行测试&#xff0c;对于sql教程依赖项使用 Mock 对象配置预期的依赖服务的行为。 Moq 是基于 Castle 的动态代理来实现的&…

mockjs入门

mockjs 1,mock.js是什么&#xff1f; mockjs是生成随机数据的一款前端工具&#xff0c;用来模拟 Ajax 请求&#xff0c;生成并返回模拟数据 2&#xff0c;为什么用mockjs&#xff1f; 当程序员做项目开发时&#xff0c;前端工程师要请求后端做好的数据时&#xff0c;有可能…

monkey简介

https://blog.csdn.net/lebang08/article/details/70858532 https://www.cnblogs.com/aland-1415/p/6949964.html https://blog.csdn.net/aisemi/article/details/55254348 一、Monkey 简介 monkey是Android SDK中自带的一个命令行工具&#xff0c;使用Java语言写成&#xf…

mokey的介绍和使用

一、monkey介绍 monkey是Android SDK提供的一个命令行工具&#xff0c;可以简单方便的发送伪随机的用户时间流&#xff0c;对Android APP做压力&#xff08;稳定性、健壮性&#xff09;测试。主要是为了测试APP是否存在无响应和崩溃的情况。 二、monkey的使用 1、前提条件&a…

APP测试— 测试工具mokey

文章目录 1 Mokey概念2 运行Monkey&#xff08;对手机进行300次无规律点击&#xff09;3 Mokey常规参数4 Monkey 事件类参数5 Monkey 约束类参数 1 Mokey概念 1&#xff09;Monkey是Android SDK提供的一个命令行工具&#xff0c;可以简单、方便的运行任何版本的Android模拟器和…

Kafka配置用户名密码访问

1 软件版本 kafka_2.12-2.4.0.tgz&#xff08;带zookeeper&#xff09; 2 kafka服务端部署 2.1 将安装包上传到服务器&#xff0c;并解压 tar zxvf kafka_2.12-2.4.0.tgz -C /datamv kafka_2.12-2.4.0 kafka2.2 修改kafka配置文件 server.properties vim /data/kafka/conf…

linux 用户名和密码的处理

1. 创建新用户和密码 # 创建用户 testuser useradd testuser# 给已创建的用户testuser设置密码 passwd testuser# 新创建的用户会在 /home 下创建一个用户目录testuser# 修改用户这个命令的相关参数 usermod --help# 删除用户testuser userdel testuser# 删除用户所在目录rm -…

用户名,密码登录

1.导入项目需要的依赖&#xff0c;分层 注意&#xff1a;如果你的数据库是5.5的版本&#xff0c;依赖要用低版本的&#xff0c;高版本不稳定&#xff0c;新增的内容不识别&#xff0c;会报各种各样奇葩的错误 2.创建实体类 它的属性要和数据库字段对应 package com.oa.entity…

实现用户输入用户名和密码登录

题目 实现用户输入用户名和密码登录&#xff0c;当用户名为admin或administrator且密码为666666时&#xff0c;显示“登录成功”&#xff0c;否则显示“登录失败”&#xff0c;登录失败时允许重复输入三次。 实例 参考程序 User1 "admin" User2 "administr…