当前位置: 首页 > article >正文

删除变慢问题

问题: 有一个场景,每天都会删除数据,SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 ,一直循环执行,当执行到最后一次满足条件的时候,就会很慢

原理分析

  1. 索引与数据分布

    • 如果 record_date 字段没有索引,数据库在执行 DELETE 语句时需要进行全表扫描(Full Table Scan),以找到满足 record_date < DATE_SUB(now(), INTERVAL ? DAY) 条件的记录。

    • 随着数据逐步删除,剩余的数据量减少,但数据库仍然需要扫描整个表(或索引)来找到符合条件的记录,尤其是在数据分布不均匀的情况下,查询效率会显著下降。

  2. 删除操作的内部机制

    • 删除操作不仅会删除数据,还会更新索引、写入事务日志(如MySQL的undo log和redo log),并可能触发锁机制(如行锁或表锁)。

    • 当删除操作接近尾声时,数据库可能需要处理更多的索引维护和日志写入操作,导致性能下降。

  3. 数据碎片化

    • 频繁的删除操作会导致数据页(Data Page)出现碎片化,数据库在查询时需要扫描更多的数据页来找到符合条件的记录,从而降低查询效率。

  4. 查询优化器的行为

    • 数据库的查询优化器可能会根据统计信息调整执行计划。当数据量减少到一定程度时,优化器可能会选择不同的执行计划(如从索引扫描切换到全表扫描),导致性能下降。


优化建议

  1. 添加索引

    • 确保 record_date 字段上有索引(如单列索引或组合索引),以加速条件过滤。例如:

      sql

      CREATE INDEX idx_record_date ON xxx(record_date);
    • 如果表中有其他常用查询条件,可以考虑创建组合索引。

  2. 分批删除优化

    • 使用主键或唯一键进行分批删除,避免全表扫描。例如:

      sql

      DELETE FROM xxx WHERE id IN (SELECT id FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY) LIMIT 1000
      );
    • 这种方法可以利用索引快速定位需要删除的记录,减少扫描范围。

  3. 分区表

    • 如果数据量非常大,可以考虑使用分区表(Partitioning),按时间(如按天、按月)对数据进行分区。删除过期数据时,直接删除整个分区,效率会显著提升。例如:

      sql

      ALTER TABLE xxx DROP PARTITION p20230101;
  4. 优化删除逻辑

    • 在删除操作前,先查询符合条件的记录数量,避免无意义的扫描。例如:

      sql

      SELECT COUNT(*) FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY);
    • 如果剩余数据量较少,可以一次性删除,避免多次循环。

  5. 定期优化表

    • 删除操作会导致数据碎片化,定期执行表优化(如 OPTIMIZE TABLE)可以整理数据页,提升查询性能。例如:

      sql

      OPTIMIZE TABLE xxx;
  6. 调整事务大小

    • 如果删除操作涉及大量数据,可以将删除操作拆分为多个小事务,避免长时间锁定表和占用过多日志空间。例如:

      sql

      START TRANSACTION;
      DELETE FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY) LIMIT 1000;
      COMMIT;
  7. 使用归档表

    • 将需要删除的数据先移动到归档表,再从归档表中删除。这种方法可以减少对主表的操作压力。例如:

      sql

      INSERT INTO xxx_archive SELECT * FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY);
      DELETE FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY);

执行计划分析

您可以通过 EXPLAIN 命令查看 DELETE 语句的执行计划,重点关注以下内容:

  • type:查询类型,如 index(索引扫描)或 ALL(全表扫描)。

  • rows:扫描的行数,如果值过大,说明查询效率较低。

  • key:使用的索引,如果没有使用索引,可能需要优化索引设计。

例如:

sql

EXPLAIN DELETE FROM xxx WHERE record_date < DATE_SUB(now(), INTERVAL ? DAY) LIMIT 1000;

总结

删除操作变慢的原因主要与索引缺失、数据碎片化、查询优化器行为以及删除操作的内部机制有关。通过添加索引、优化删除逻辑、使用分区表等方法,可以显著提升删除操作的效率。如果数据量非常大,建议结合归档表和分区表的设计,进一步优化数据清理任务。

相关文章:

删除变慢问题

问题&#xff1a; 有一个场景&#xff0c;每天都会删除数据&#xff0c;SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 &#xff0c;一直循环执行&#xff0c;当执行到最后一次满足条件的时候&#xff0c;就会很慢 原理分析 索引与…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...

游戏引擎学习第131天

仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化&#xff0c;特别是针对渲染和多线程的部分。目前&#xff0c;我们的目标是让地面块在独立线程上进行渲染&#xff0c;以提高性能。在此过程中&#xff0c;我…...

人大金仓国产数据库与PostgreSQL

一、简介 在前面项目中&#xff0c;我们使用若依前后端分离整合人大金仓&#xff0c;在后续开发过程中&#xff0c;我们经常因为各种”不适配“问题&#xff0c;但可以感觉得到大部分问题&#xff0c;将人大金仓视为postgreSQL就能去解决大部分问题。据了解&#xff0c;Kingba…...

《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》

--- ## 前言&#xff1a;为什么传统学习法正在杀死你的竞争力&#xff1f; 在新能源汽车领域&#xff0c;我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时&#xff0c;固态电池已进入量产倒计时&#xff1b;当自动驾驶还在L2级徘…...

存贮论模型案例与Matlab实现

摘要&#xff1a;本文结合存贮论确定性模型&#xff0c;详细解析经济订购批量&#xff08;EOQ&#xff09;、允许缺货生产批量等核心模型&#xff0c;并通过商品库存管理、生产计划等实际案例&#xff0c;配合Matlab代码实现&#xff0c;展示模型求解过程。涵盖公式推导、参数优…...

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...

linux 内核dumpstack定位使用举例说明

1,在 Linux 内核中&#xff0c;当你需要定位问题时&#xff0c;dump_stack() 函数是一个非常有用的工具&#xff0c;那么什么时候使用dump_stack&#xff0c;怎么使用dump_stack呢 通常使用的是前者&#xff09;函数通常在以下情况下被用来帮助定位问题&#xff1a; 调试内核代…...

360个人版和企业版的区别

功能方面 管理能力 个人版&#xff1a;主要用于单台设备的安全防护&#xff0c;只能在单独的电脑上进行安装使用&#xff0c;无集中管理和监控其他设备的功能。企业版&#xff1a;可批量管理大量电脑&#xff0c;如公司的十台、百台甚至千台电脑。管理员能通过管理控制台对所有…...

服务器迁移记录【腾讯云-->阿里云】

准备工作 压缩/root /usr/local/nginx /data三个目录到zip&#xff0c;并下载到本地。 zip root.zip /root zip nginx.zip /usr/local/nginx zip data.zip /datasz root.zip sz nginx.zip sz data.zip连接mysql数据库&#xff0c;导出数据库结构与数据到dzs_mysql.sql 安装l…...

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…...

【vue-echarts】——05.柱状图

文章目录 一、柱状图基本设置1.实现代码2.结果展示二、柱状图效果实现11.代码实现2.结果展示三、柱状图效果实现21.代码实现2.结果展示一、柱状图基本设置 柱状图:一种图表类型,因为构成是由一根一根类似柱子的数据条组合而成的坐标平面,所以命名为柱状 图。主要是用来反应对…...

计算机毕业设计SpringBoot+Vue.js人力资源管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

腾讯云扩容记录

腾讯云扩容&#xff1a; sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理&#xff1a; 1. 安装 cloud…...

Cherry Studio + 火山引擎 构建个人AI智能知识库

&#x1f349;在信息化时代&#xff0c;个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时&#xff0c;效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…...

RocketMQ启动教程

环境是ubuntu&#xff0c;建议ubuntu&#xff0c;因为有root用户权限够大&#xff0c;不像windows十分费劲&#xff0c;跑Docker总是遇到权限问题&#xff0c;但是ubuntu的话就很轻松了&#xff0c;整个流程非常顺利 文章目录 1.Docker安装NameServer2.安装broker3.Docker安装 …...

完美解锁便捷版!

视频文件的种类繁多&#xff0c;包括常见的格式如MP4、AVI、MOV、MKV等。随着视频技术的发展&#xff0c;新的编码格式如HEVC&#xff08;H.265&#xff09;和AV1也逐渐被广泛应用&#xff1b;视频文件通常会经过压缩&#xff0c;并且每种格式都有其独特的编码方式和特性&#…...

JAVA SE 包装类和泛型

文章目录 &#x1f4d5;1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 &#x1f4d5;2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…...

人工智能AI在汽车设计领域的应用探索

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

driver中为什么要使用非阻塞赋值

1. 模拟硬件时序行为 实际硬件行为&#xff1a;DUT的输入信号通常在时钟边沿被采样。Driver需要确保信号的更新与时钟同步&#xff0c;而非阻塞赋值的延迟更新特性&#xff08;在时间步结束时统一生效&#xff09;能够准确模拟寄存器的行为。 示例&#xff1a; always (posedg…...

Vue3国际化开发实战:i18n-Ally + vue-i18n@next高效配置教程,项目中文显示

本文详解 Vue3 国际化开发全流程&#xff1a;从安装 vue-i18nnext 到配置多语言文件&#xff08;JSON/YAML&#xff09;&#xff0c;结合 i18n-Ally 插件实现高效翻译管理。重点涵盖&#xff1a; 工程配置&#xff1a;创建 i18n 实例、模块化语言文件结构&#xff08;支持命名…...

深入理解Spring @Async:异步编程的利器与实战指南

一、为什么需要异步编程&#xff1f; 在现代高并发系统中&#xff0c;同步阻塞式编程会带来两大核心问题&#xff1a; // 同步处理示例 public void processOrder(Order order) {// 1. 保存订单&#xff08;耗时50ms&#xff09;orderRepository.save(order); // 2. 发送短信…...

java后端开发day25--阶段项目(二)

&#xff08;以下内容全部来自上述课程&#xff09; 1.美化界面 private void initImage() {//路径分两种&#xff1a;//1.绝对路径&#xff1a;从盘符开始写的路径 D:\\aaa\\bbb\\ccc.jpg//2.相对路径&#xff1a;从当前项目开始写的路径 aaa\\bbb\\ccc.jpg//添加图片的时…...

Python接口自动化中操作Excel文件的技术方法

在Python接口自动化测试中&#xff0c;操作Excel文件是一项常见且关键的技术需求。Excel作为数据存储和数据分析的重要工具&#xff0c;在自动化测试中通常用于存储测试用例、测试数据以及测试结果。通过Python操作Excel&#xff0c;可以大大提高测试的效率和灵活性。以下是一些…...

几道考研数学题求解

函数性质问题 【题目】 已知函数 f ( x , y ) x 3 y 3 − ( x y ) 2 3 f(x, y) x^3 y^3 - (xy)^2 3 f(x,y)x3y3−(xy)23。设 T T T 为曲面 z f ( x , y ) z f(x, y) zf(x,y) 在点 ( 1 , 1 , 1 ) (1,1,1) (1,1,1) 处的切平面&#xff0c; D D D 为 T T T 与坐标…...

如何在Spring Boot项目中集成JWT实现安全认证?

在Spring Boot项目中集成JWT实现安全认证是常见的需求。本文将详细介绍如何在Spring Boot项目中集成JWT&#xff0c;并通过一个完整的示例演示如何实现安全认证。 一、环境准备 首先&#xff0c;确保你的Spring Boot项目已经创建。然后&#xff0c;添加以下依赖到pom.xml文件…...

【 开发知识点 一 】 随机数生成器 /dev/urandom 和 /dev/random

文章目录 一、随机数生成器 是什么 ?二、为什么 需要 随机数生成器 ?三、随机数生成器 基本原理四、随机数生成器 三个输出接口五、随机生成器 应用1、简单应用2、项目应用一、随机数生成器 是什么 ? /dev/random 和 /dev/urandom 是 Linux 上的字符设备文件,它们是随机数…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展&#xff0c;数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言&#xff0c;提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架&#xff0c;分析其特点、应用场景以及未来发展趋…...

Django ORM 的常用字段类型、外键关联的跨表引用技巧,以及 `_` 和 `__` 的使用场景

一、Django ORM 常用字段类型 1. 基础字段类型 字段类型说明示例CharField字符串字段&#xff0c;必须指定 max_lengthname models.CharField(max_length50)IntegerField整数字段age models.IntegerField()BooleanField布尔值字段is_active models.BooleanField()DateFiel…...

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…...