如果使用 MySQL 的分区功能,按照时间分区,来进行数据的归档管理,定时删除历史数据,从而实现数据生命周期的管理,这样是很方便的。但是,由于创建和删除分区都属于 DDL,如果有慢 SQL 的话,DDL 等慢SQL会使用metadata lock元数据锁,从而引起阻塞。
但是,使用存储过程+DELETE清理数据,往往会引起全表扫,如果表内数据非常大,清理效率会很低。
本文讲解了如何在存储过程中合理利用索引清理数据。

一、准备表结构(测试数据量740W)
CREATE TABLE `test`.`procedure_test` (`pk` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`data_time` varchar(100) DEFAULT NULL COMMENT '数据时间,格式:2020-07-21 23:00:36',`altitude` double DEFAULT NULL COMMENT '海拔高度 (单位米)',`lat` double DEFAULT NULL COMMENT '纬度',`lon` double DEFAULT NULL COMMENT '经度',`derection` bigint(20) DEFAULT NULL COMMENT '方向 0-359 单位° ;正北为0,顺时针',`statecode` varchar(100) DEFAULT NULL COMMENT '状态信息',PRIMARY KEY (`pk`),KEY `idx_data_time` (`data_time`)
) COMMENT='存储过程清理数据测试表';
二、错误示范
-- 清理3天前的数据
CREATE DEFINER=`my_admin`@`%` PROCEDURE `test`.`p_procedure_test_delete_3day_ago`()
BEGIN
delete from test.procedure_test where data_time < (CURRENT_TIMESTAMP() + interval - 3 day);
END
三、错误解法
-- 清理3天前的数据
CREATE DEFINER=`my_admin`@`%` PROCEDURE `test`.`p_procedure_test_delete_3day_ago`()
BEGIN
DECLARE before_dt datetime;
select (CURRENT_TIMESTAMP() + interval - 3 day) into before_dt;
delete from test.procedure_test where data_time < before_dt;
END
三、正确示范
-- 清理3天前的数据
CREATE DEFINER=`my_admin`@`%` PROCEDURE `test`.`p_procedure_test_delete_3day_ago`()
BEGIN
DECLARE before_dt datetime;
DECLARE delete_sql varchar(1024);
select (CURRENT_TIMESTAMP() + interval - 3 day) into before_dt;
set delete_sql = CONCAT("delete from test.procedure_test where data_time < '",before_dt,"'");
set @dlt = delete_sql;
prepare dlt from @dlt;
execute dlt;
deallocate prepare dlt;
END
四、原理解析

1、错误示范中,由于在 where条件中调用了函数(CURRENT_TIMESTAMP() + interval - 3 day),导致删除语句无法使用,引起了全表扫,下面为 explain 语句结果:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE procedure_test ALL idx_data_time 7403414 Using where

2、错误解法,妄图使用变量的形式来执行,但是结果和示范一致,无法正确使用索引提高效率。
3、正确示范中,使用了 prepare来执行动态语句,成功解决了这个问题,explain 结果为:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE procedure_test range idx_data_time idx_data_time 303 311888 Using index condition

4、成功使用索引后,执行效率大大提高了,从全表扫(7403414),到使用索引(311888)。
5、结合 event 定时任务使用:

CREATE EVENT e_procedure_test_delete_120_minute
ON SCHEDULE EVERY 7200 SECOND
STARTS '2020-11-16 22:00:00.000'
ON COMPLETION PRESERVE
ENABLE
DO call p_procedure_test_delete_3day_ago()

MySQL-存储过程-高效清理数据相关推荐

  1. MySQL存储过程 — 解析 XML 数据并实现插入操作

    MySQL存储过程 - 解析 XML 数据并实现插入操作 一.概述: 最近在做项目的过程中,需要利用MySQL存储过程 解析 XML数据并进行插入操作,因此就学习了下.MySQL 解析 XML 的思路 ...

  2. 利用MYSQL存储过程批量造数据

    作为一名测试工程师,造这种存量数据,一般都是压测的时候需要一些存量数据.我平时用Jmeter比较多,比较少用到MYSQL的存储过程,最近浏览博客,看到有人用这个方式造数据,就趁机体验了一把. 一般的压 ...

  3. mysql 存储过程 批量导入数据_sql 利用存储过程批量导入数据

    什么是 存储过程(stored procedure)是一组为了完成特定功能的sql语句集,是利用sql server所提供的transact-sql语言所编写的程序.经编译后存储在中.存储过程是数据库 ...

  4. MySQL存储过程批量插入数据

    文章目录 1. 怎么写出来的?踩了哪些坑 1.1 新建存储过程的语法 1.2 声明变量 1.3 存储过程参数 1.4 WHILE循环 1.5 写存储过程 1. 怎么写出来的?踩了哪些坑 因为阿里Jav ...

  5. mysql存储过程 大小写_MySQL数据记录大小写敏感问题【转】

    MySQL大小写敏感 字符串大小写敏感和Mysql的数据库的名字.表名字.字段名字.还有字段值有关. 1.和数据库名字.表名字.存储过程和触发器有关 为0时: 表示区分大小写,使用CREATE TAB ...

  6. mysql+存储过程+删除重复数据_mysql 存储过程 删除重复

    DELIMITER $$ CREATE PROCEDURE `delRepeatCA`() BEGIN DECLARE tally INT DEFAULT 0; SELECT COUNT(rs.c_C ...

  7. mycat mysql 存储过程_MyCat 学习笔记 第十三篇.数据分片 之 通过HINT执行存储过程...

    1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  330 ...

  8. mysql数据库存储数据的过程_[数据库]MySql存储过程总结

    [数据库]MySql存储过程总结 0 2014-06-12 01:00:50 之前总是在MSSQL上写存储过程,没有在MYSQL上写过,也基本没有用过,今天需要用到MYSQL,研究了下,把项目的需要的 ...

  9. mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表.DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_xx ...

  10. mysql 存储过程 脚本_mysql利用存储过程插入大量数据脚本

    1.检查是否开启二进制日志 #查看是否开启二进制日志,ON表示开启,OFF表示没有开启 show variables like'log_bin_trust_function_creators'; #若 ...

最新文章

  1. vs2008断点上出现感叹号解决办法
  2. Cisco 3550-EMI 交 换 机 配 置 教 程
  3. C语言const关键字—也许该被替换为readolny
  4. Android之自定义checkbox样式
  5. sqoop的安装和使用
  6. java中hashcode和equals的区别和联系
  7. Python学习笔记(尚硅谷)
  8. 支持向量机的基本原理
  9. 服务器网卡有什么作用,服务器网卡的作用
  10. jenkins连接Linux
  11. 如何设置input只能输入数字
  12. 描述一下普适计算时代中的计算机,浅析普适计算及其应用.doc
  13. 特征放缩(Feature scaling)
  14. L4操作系统(L4/Fiasco介绍)
  15. 前端复习之DOM、BOM
  16. html如何上下滚动字幕,css如何做滚动字幕效果?
  17. ILSpy中baml转化为xaml的改进(四)
  18. 吉德林法则 (Kidlin's Law)的真实案例(1)
  19. 好用的系统检测工具与硬盘检测工具
  20. shadow使用方法

热门文章

  1. UCHome二次开发 规范
  2. 第3.1~3.3节《合成孔径雷达成像原理-皮亦鸣》
  3. 在Ubuntu 10上使用D-Link DWA 130无线网卡
  4. android自动画廊,Android3D画廊效果与自动轮播Banner
  5. ​有哪些比较好的录制游戏视频软件​,游戏录屏软件哪个好用
  6. The RSpec Book笔记《三》Automating Features with Cucumber使用cucumber自动完成features
  7. 【编译原理】自上而下语法分析(C/C++源码+实验报告)
  8. 健康体检信息系统源码、医院体检源码 医院管理系统源码
  9. 产品经理如何更优商业思维
  10. 浏览器预览pdf文件名称不对,Java使用iText修改Pdf文件的标题属性,自定义预览文件名