MySQL清理数据并释放磁盘空间的实现示例

 更新时间:2023年07月12日 08:32:15   作者:杨同学technotes  
本文主要介绍了MySQL如何清理数据并释放磁盘空间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在我们的生产环境中有一张表:courier_consume_fail_message,是存放消息消费失败的数据的,设计之初,这张表的数据量评估在万级别以下,因此没有建立索引。

但目前发现,该表的数据量已经达到百万级别,原因产生了大量的重试消费,这导致了该表的慢查询。

因此需要清理该表数据。而实际上,使用 DELETE 命令删除数据后,我们发现查询速度并没有显著提高,甚至可能会降低。为什么?

因为 DELETE 命令只是标记该行数据为“已删除”状态,并不会立即释放该行数据在磁盘中所占用的存储空间,这样就会导致数据文件中存在大量的碎片,从而影响查询性能。所以,除了删除表记录外,还需要清理磁盘碎片。

在表碎片清理前,我们关注以下四个指标。

  • 指标一:表的状态:SHOW TABLE STATUS LIKE 'courier_consume_fail_message';
  • 指标二:表的实际行数:SELECT count(*) FROM courier_consume_fail_message;
  • 指标三:要清理的行数:SELECT count(*) FROM courier_consume_fail_message where created_at < '2023-04-19 00:00:00';
  • 指标四:表查询的执行计划:EXPLAIN SELECT * FROM courier_consume_fail_message WHERE service='courier-transfer-mq';
 -- 清理磁盘碎片
 OPTIMIZE TABLE courier_consume_fail_message;

以下是清理前后的指标对比。

一、清理前

指标一,表的状态:

img

指标二,表的实际行数:76986

指标三,要清理的行数:76813

指标四,表查询的执行计划:

二、清理数据

下面是执行 DELETE FROM courier_consume_fail_message WHERE created_at < '2023-04-19 00:00:00'; 后的统计。

指标一,表的状态:

img

指标二,表的实际行数:173

指标三,要清理的行数:0

指标四,表查询的执行计划:

img

通过指标四可以看到,清理表记录后,查询扫描的行数依然没变:8651048。

三、清理碎片

下面是执行 OPTIMIZE TABLE courier_consume_fail_message; 后的统计。

指标一,表的状态:

img

指标四,表查询的执行计划:

img

通过指标四可以看到,清理表记录后,查询扫描的行数变成了 100。

小结

可以看到,该表的数据行数和数据长度都被清理了,查询语句扫描的行数也减少了。

为了提升 SELECT * FROM courier_consume_fail_message WHERE service='courier-transfer-mq'; 语句的查询效率,还是应当建立索引。

 alter` `table` `ec_courier.courier_consume_fail_message ``add` `index` `idx_service(service);

到此这篇关于MySQL清理数据并释放磁盘空间的实现示例的文章就介绍到这了,更多相关MySQL 清理数据并释放磁盘空间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 踩坑MySQL UNION和ORDER BY混用的问题及解决

    踩坑MySQL UNION和ORDER BY混用的问题及解决

    MySQL中UNION合并多个子集时,内部ORDER BY可能失效,解决方法:各子集添加LIMIT,外层再包裹SELECT并使用ORDER BY,确保整体排序正确
    2025-09-09
  • 教你使用MySQL Shell连接数据库的方法

    教你使用MySQL Shell连接数据库的方法

    在有些情况下我们需要使用命令行方式连接MySQL数据库,这时可以使用MySQL官方提供的命令行工具MySQL Shell,今天通过本文给大家介绍下mysql Shell连接数据库的方法,感兴趣的朋友一起看看吧
    2022-04-04
  • mysql多个TimeStamp设置的方法解读

    mysql多个TimeStamp设置的方法解读

    timestamp设置默认值是Default CURRENT_TIMESTAMP;timestamp设置随着表变化而自动更新是ON UPDATE CURRENT_TIMESTAMP;接下来为您详细介绍
    2012-11-11
  • 你知道mysql中空值和null值的区别吗

    你知道mysql中空值和null值的区别吗

    这篇文章主要给大家介绍了关于mysql中空值和null值区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 解析mysql中如何获得数据库的大小

    解析mysql中如何获得数据库的大小

    本篇文章是对mysql中如何获得数据库的大小的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql中Innodb 行锁实现原理

    mysql中Innodb 行锁实现原理

    InnoDB的行锁是通过索引项加锁实现的,分为使用索引和非索引字段检索的情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • MySQL limit分页大偏移量慢的原因及优化方案

    MySQL limit分页大偏移量慢的原因及优化方案

    这篇文章主要介绍了MySQL limit分页大偏移量慢的原因及优化方案,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL中表复制:create table like 与 create table as select

    MySQL中表复制:create table like 与 create table as select

    这篇文章主要介绍了MySQL中表复制:create table like 与 create table as select,需要的朋友可以参考下
    2014-12-12
  • MySQL 中的权限管理及验证流程

    MySQL 中的权限管理及验证流程

    这篇文章主要介绍了MySQL 中的权限管理及验证流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 定位和优化mysql慢查询的常见方法分享

    定位和优化mysql慢查询的常见方法分享

    MySQL中的慢查询(Slow Query)指执行时间超过指定阈值的查询语句,默认阈值是long_query_time参数设置的秒值,MySQL有几种常见的方法可以发现和获取慢查询,接下来小编将给大家详细的介绍一下这些方法,需要的朋友可以参考下
    2023-08-08

最新评论