解决数据量过大——Navicat实现数据库每日分表
创始人
2025-05-28 11:03:07
0

数据量过大问题——分表

背景:底层硬件传输数据量很大,几秒中传输一次数据;而目前的数据库架构是所有的硬件数据都存放在一张表中。

这种数据库的设计下,在一些小数据量的项目中问题不大。但对于我目前的这个项目来说,每几秒就要传输一次数据,底层硬件的数量还不少,没几天数据量就要成千上百万了!还存放在同一张表中,这种查询的速度可想而知。


大体思路

第一种方式:数据库分表:

  1. 首先,获取当前的日期,每到第二天时自动创建新表,将逻辑表的数据换到新表中,只留下一个逻辑表存放每天的数据,即新表是以前的历史表;
  2. 生成新表前,先判断是否存在逻辑表,存在逻辑表则生成新表的名字为:逻辑表名 + 日期;
  3. 根据逻辑表的结构,创建新表,新表内存储着前一天的所有数据。

简单来说,就是我们维持一个逻辑表,平时对当日的数据查询只查这个逻辑表;只有历史查询的时候才会多表联查以前的历史表。每天自动将现有的逻辑表改名成历史表名称,然后创建相同表结构的逻辑表(这个新逻辑表为空)。


具体实现:

  1. 第一步:获取当前日期。
		-- 获取当前日期SET @suffix = DATE_FORMAT(DATE_SUB(CURDATE(),interval-1 day),'%Y%m%d');
  1. 第二步:检查旧表(逻辑表)是否存在,存在则重命名这个旧表为 逻辑表名 + 日期。
-- 检查旧表是否存在,如果存在,则重命名为new_table_oldIF EXISTS (SELECT * FROM information_schema.tables WHERE table_schema = 'mmo'AND table_name = 'new_table')THEN-- 将当前日期与表名拼接,并创建新表SET @old_table_name = 'new_table';SET @new_table_name = CONCAT('new_table_', @suffix);-- 使用动态SQL修改表名SET @sql = CONCAT('ALTER TABLE ', @old_table_name, ' RENAME TO ', @new_table_name);PREPARE stmt FROM @sql;EXECUTE stmt;END IF;
  1. 第三步:创建新的逻辑表。
		-- 然后再创建新表CREATE TABLE IF NOT EXISTS new_table (id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL,email VARCHAR(50) NOT NULL);

综合上述步骤,可以汇总成下列函数过程:

BEGIN-- 获取当前日期SET @suffix = DATE_FORMAT(DATE_SUB(CURDATE(),interval-1 day),'%Y%m%d');-- 检查旧表是否存在,如果存在,则重命名为new_table_oldIF EXISTS (SELECT * FROM information_schema.tables WHERE table_schema = 'mmo'AND table_name = 'new_table')THEN-- 将当前日期与表名拼接,并创建新表SET @old_table_name = 'new_table';SET @new_table_name = CONCAT('new_table_', @suffix);-- 使用动态SQL修改表名SET @sql = CONCAT('ALTER TABLE ', @old_table_name, ' RENAME TO ', @new_table_name);PREPARE stmt FROM @sql;EXECUTE stmt;END IF;-- 然后再创建新表CREATE TABLE IF NOT EXISTS new_table (id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL,email VARCHAR(50) NOT NULL);
END

为了每天能够自动创建新表,我们可以在navicate中创建一个事件,每日自动调用事件执行函数即可。

在这里插入图片描述
在这里插入图片描述

一些补充:

由于项目中需要根据每天的时间修改表名,所以普通的 ALTER 语句不能根据变量名来修改表名

因为存在表名要和时间变量拼接的问题,我在这里使用了 动态sql语句 来实现拼接功能。上面的案例只是简单的实现,在实际开发中还涉及到sql注入问题、修改的新表名添加到数据库表中等相关实现,需要在项目开发中根据实际情况加以判断和修改。

相关内容

热门资讯

消防培训心得体会 消防培训心得体会13篇  当我们受到启发,对生活有了新的感悟时,马上将其记录下来,这样可以帮助我们总...
上网课心得体会 上网课心得体会(通用10篇)  某些事情让我们心里有了一些心得后,可以将其记录在心得体会中,这样有利...
新时代师德的重要内涵心得 新时代师德的重要内涵心得(精选13篇)  心得体会是指一种读书、实践后所写的感受性文字。语言类读书心...
化学实验安全心得体会 化学实验安全心得体会(通用10篇)  心得体会是指一种读书、实践后所写的感受性文字。语言类读书心得同...
大学生社会实践心得体会150...   而作为一名还未走出校园的学生,我深知自己要学的东西有很多很多,对即将踏入的工作岗位又有着太多的陌...
心态管理培训心得与体会样本三... 心态管理培训心得与体会样本三例  篇一:心态管理培训心得与体会  入职第二天,公司的人事经理对我们新...
实习心得体会 实习心得体会(精选31篇)  当我们经过反思,对生活有了新的看法时,马上将其记录下来,它可以帮助我们...
志愿者活动心得体会 志愿者活动心得体会500字(通用6篇)  当我们经过反思,对生活有了新的看法时,马上将其记录下来,这...
教育名著读书心得 教育名著读书心得(通用29篇)  当我们积累了新的体会时,就十分有必须要写一篇心得体会,这样能够给人...
洛阳实习报告 洛阳实习报告  一段充实而忙碌的实习生活结束了,相信你积累了不少实习心得,让我们一起来学习写实习报告...
《小英雄雨来》读书笔记 《小英雄雨来》读书笔记45篇  读完一本书以后,大家心中一定是萌生了不少心得,何不写一篇读书笔记记录...
团支部个人心得体会 团支部个人心得体会范文(精选5篇)  当我们积累了新的体会时,不如来好好地做个总结,写一篇心得体会,...
劳动节活动心得体会 劳动节活动心得体会(通用5篇)  当在某些事情上我们有很深的体会时,可用写心得体会的方式将其记录下来...
护理学专业的心得体会 护理学专业的心得体会(通用13篇)  在平日里,心中难免会有一些新的想法,马上将其记录下来,这样有利...
工作心得体会感悟 工作心得体会感悟(通用18篇)  从某件事情上得到收获以后,往往会写一篇心得体会,如此就可以提升我们...
采购课程培训心得体会 采购课程培训心得体会范文(通用13篇)  我们心里有一些收获后,可以通过写心得体会的方式将其记录下来...
疫情期间做社区志愿服务心得 疫情期间做社区志愿服务心得  有了一些收获以后,写一篇心得体会,记录下来,这样可以帮助我们分析出现问...
被隔离人员心得体会 被隔离人员心得体会  我们有一些启发后,将其记录在心得体会里,让自己铭记于心,这么做可以让我们不断思...
从优秀到卓越读书心得 从优秀到卓越读书心得(通用18篇)  当阅读了一本名著后,大家心中一定有不少感悟,是时候静下心来好好...
小学生读书心得体会 小学生读书心得体会范文(精选10篇)  当我们受到启发,对生活有了新的感悟时,不妨将其写成一篇心得体...