存储过程定时对数据库表进行迁移

业务运行一段时间后,会出现有些表数据量很大,可能对系统性能产生不良的影响,常见的如订单表、登录log表等,这些数据很有时效性,比如我们一般很少去查上个月的订单,最多也就是报表统计会涉及到。

解决方案:创建一张与A表字段一样的B表,每天定时把A表昨天的数据插入到B表,再把A表昨天之前的数据删除,也可以根据需求改成一个月一次。如果不想只保存到一张表里,也可以在存储过程中,以年月份为后缀每次新建表。

1、首先创建一个存储过程

DELIMITER $

/*数据库名称*/

USE `dbcp`$$

/*存储过程名称*/

DROP PROCEDURE IF EXISTS `apaas_log_procedure`$$

CREATE DEFINER=`root`@`%` PROCEDURE `apaas_log_procedure`()

BEGIN

    SET @current_time = NOW();

    /*备份昨天之前的数据*/

    INSERT INTO `apaas_log_copy`

    SELECT * FROM `apaas_log`

    WHERE DATEDIFF(`create_Date`,@current_time) < 0;

    /*删除昨天之前的数据*/

    DELETE FROM `apaas_log`

    WHERE DATEDIFF(`create_Date`,@current_time) < 0;

    /*备份昨天之前的数据*/

    INSERT INTO `apaas_log_unqualified_copy`

    SELECT * FROM `apaas_log_unqualified`

    WHERE DATEDIFF(`create_Date`,@current_time) < 0;

    /*删除昨天之前的数据*/

    DELETE FROM `apaas_log_unqualified`

    WHERE DATEDIFF(`create_Date`,@current_time) < 0;

    END$$

DELIMITER ;

2、创建定时事件

DELIMITER $$

/*每天4点执行*/

ALTER DEFINER=`root`@`%` EVENT `apaas_log_event`

ON SCHEDULE EVERY 1 DAY STARTS '2019-02-19 04:00:00'

ON COMPLETION PRESERVE ENABLE DO CALL apaas_log_procedure()$$

DELIMITER ;

3.启动定时任务

/*启动定时任务*/

SET GLOBAL event_scheduler = 1

/*关闭定时任务*/

SET GLOBAL event_scheduler = 0

/*查看定时任务状态*/

SHOW VARIABLES LIKE '%event_sche%'

---------------------------------------------------------------------------

1.在使用之前必须确保 event_scheduler已开启

2.创建素具迁移的存储过程

DELIMITER $$

USE `yst_uic_service`$$

DROP PROCEDURE IF EXISTS `Sync_uchome_seen_history`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Sync_uchome_seen_history`(IN tabSize INT)

BEGIN

 DECLARE i INT DEFAULT 0;

## 获取需同步数据的时间节点(上个月)

SET @upmonth= DATE_ADD(NOW(), INTERVAL -1 MONTH);

WHILE i < tabSize DO

SET @sqlstr=CONCAT('INSERT INTO `uchome_history_',i,'`(`icon`,`uid`,`epgId`,`detailsId`,`score`,`titleData`,`datePoint`,`dateLine`,`objtype`,`templateId`,`times`,`watchTime`)

   SELECT `icon`,`uid`,`epgId`,`detailsId`,`score`,`titleData`,`datePoint`,`dateLine`,`objtype`,`templateId`,`times`,`watchTime` FROM `uchome_seen_',i,'`  WHERE `dateLine`<=?');     

SET @delsqlstr=CONCAT('delete from `uchome_seen_',i,'` WHERE `dateLine`<=? ');

#执行数据迁移

PREPARE _stmt FROM @sqlstr;

EXECUTE _stmt USING @upmonth;

DEALLOCATE PREPARE _stmt;

#执行迁移后的数据删除

PREPARE _stdel FROM @delsqlstr;

EXECUTE _stdel USING @upmonth;

DEALLOCATE PREPARE _stdel;

SET i := i+1;

END WHILE;

END$$

DELIMITER ;

3.创建定时任务

DELIMITER $$

ALTER DEFINER=`root`@`localhost` EVENT `Sync_uchome_seen_history`

 ON SCHEDULE EVERY 1 DAY

   STARTS '2015-06-29 01:30:00'

 ON COMPLETION NOT PRESERVE ENABLE

   DO CALL`Sync_uchome_seen_history`(10)$$

DELIMITER ;

4.关闭和开启任务时间

临时关闭: ALTER EVENT  Sync_uchome_seen_history  ON  COMPLETION PRESERVE DISABLE;

关闭任务 :  ALTER EVENT  Sync_uchome_seen_history DISABLE;

临时开启:  ALTER EVENT Sync_uchome_seen_histor
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在不改变原有业务情况下,将订单进行分区、分或者归档存储,可以考虑按照时间进行分区。可以将订单数据按照年份进行分区,每个年份对应一个分区。 这样在查询一年内的订单数据时,只需要查询对应年份的分区即可,大大减少了查询数据的量,提升了查询效率。在统计功能的时候,如果需要查询多个年份的数据,可以合并多个分区的数据即可。 另外MySQL也支持归档技术,可以将一些不常用的数据进行归档存储,这样可以节省数据库空间,并且不会影响正常查询。 ### 回答2: 在不改变原有业务情况的前提下,我们可以使用Spring Boot和MySQL进行订单的分区、分或者归档存储。根据需求,在一般情况下,只查询一年内的订单数据,而只有在统计功能的时候才会涉及多个年份的查询。 对于分区存储,我们可以将订单根据订单时间进行分区。可以根据每个月、每个季度或者每年来创建对应的分区,例如创建12个分区来存储每个月的订单数据。这样,在查询一年内的订单数据时,可以直接查询对应的分区,提高查询效率。 对于分存储,我们可以将订单数据存储在多个中。可以按照订单时间的年份进行,例如每年创建一个新的订单。查询一年内的订单数据时,只需查询对应的订单即可。同时,可以使用数据库的触发器或者定时任务来自动进行的创建和切换,实现自动化管理。 对于归档存储,我们可以将历史订单数据进行归档操作。将过去年份的订单数据迁移至归档中,保留主要的查询字段,减少冗余数据和存储空间。查询一年内的订单数据时,查询主;只有在统计功能时,才查询归档。 通过以上方式的选择,我们可以根据具体需求和业务情况,灵活地进行订单的分区、分或者归档存储。在一般情况下,只查询一年内的订单数据,可以保证查询效率;只有在统计功能的时候,才会多个年份一起查询,满足统计需求。同时,使用Spring Boot可以方便地操作数据库,实现存储方案的快速开发和部署。 ### 回答3: 在不改变原有业务情况下,可以使用Spring Boot结合MySQL的分区、分或归档存储来优化订单查询的性能。根据需求,只有在统计功能的时候才会多个年份一起查询,一般情况下只需要查询一年内的订单数据。 首先,可以考虑对订单进行分区存储。可以根据订单的创建时间进行分区,按照年份进行分区,保证一年的订单数据存储在同一个分区中。这样可以有效地减少查询的数据量,提高查询性能。具体可以通过MySQL的分区功能来实现。 其次,可以将订单进行存储。根据订单的创建时间,可以将订单数据按照年份进行存储,每一年的订单数据存储在一个单独的中。这样可以进一步减小每个的数据量,提高查询效率。在查询一年内的订单数据时,只需要查询对应年份的即可。 最后,可以考虑将订单的历史数据进行归档存储。根据需求,在一般情况下只需要查询一年内的订单数据,可以将超过一年的历史订单数据归档存储到其他存储介质中,如磁盘、分布式文件系统等。这样可以减小订单的数据量,提高查询性能。 通过以上的分区、分和归档存储策略,可以在不改变原有业务情况下优化订单的查询性能。在一般情况下只查询一年内的订单数据,可以通过分区和分减少查询的数据量;而在统计功能中需要查询多个年份时,可以将多个合并查询。在实现过程中,可以使用Spring Boot提供的JPA或MyBatis等框架进行实现,并且根据具体的需求进行SQL的优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值