博客
关于我
MySQL-存储过程-高效清理数据
阅读量:459 次
发布时间:2019-03-06

本文共 2299 字,大约阅读时间需要 7 分钟。

如何在存储过程中合理利用索引清理数据

在存储过程中清理数据时,往往会引起全表扫,如果表内数据非常大,清理效率会很低。以下将讲解如何在存储过程中合理利用索引清理数据。

一、准备表结构(测试数据量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`()BEGINdelete 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`()BEGINDECLARE 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`()BEGINDECLARE 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

原理解析

  • 错误示范中,由于在 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 NULL NULL NULL 7403414 Using where
    1. 错误解法,试图通过变量的形式来执行,但结果与上述一致,无法正确利用索引提高效率。

    2. 正确示范中,通过使用 prepare 来执行动态语句,成功解决了问题,以下是 explain 语句的结果:

    3. 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 NULL 311888 Using index condition
      1. 成功使用索引后,执行效率大大提高,从全表扫 (7403414) 到使用索引 (311888)。

      2. 结合 event 定时任务使用

      3. CREATE EVENT e_procedure_test_delete_120_minuteON SCHEDULE EVERY 7200 SECONDSTARTS '2020-11-16 22:00:00.000'ON COMPLETION PRESERVE ENABLEDO call p_procedure_test_delete_3day_ago()

    转载地址:http://ixzbz.baihongyu.com/

    你可能感兴趣的文章
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NVelocity标签使用详解
    查看>>
    nvidia-htop 使用教程
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>