首页 > 数据库 >MySQL如何清理数据并释放磁盘空间

MySQL如何清理数据并释放磁盘空间

时间:2023-12-14 18:49:05浏览次数:29  
标签:consume courier 清理 指标 磁盘空间 MySQL fail message

在我们的生产环境中有一张表: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';
sql复制代码 -- 清理磁盘碎片
OPTIMIZE TABLE courier_consume_fail_message;
以下是清理前后的指标对比。

一、清理前
指标一,表的状态:

 

 

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

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

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

 

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

指标一,表的状态:

 

 

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

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

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

 

 

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

三、清理碎片
下面是执行 OPTIMIZE TABLE courier_consume_fail_message; 后的统计。

指标一,表的状态:

 

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

 

 

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

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

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

perl复制代码 alter` `table` `ec_courier.courier_consume_fail_message ``add` `index` `idx_service(service);

原文链接:https://blog.csdn.net/weixin_64403990/article/details/131697592

标签:consume,courier,清理,指标,磁盘空间,MySQL,fail,message
From: https://www.cnblogs.com/thb-blog/p/17901753.html

相关文章

  • mysql
    mysql1、安装#mysql5.7-name:准备mysql安装包copy:src:/mysqlsql-{{MYSQL_VERSION}}.tar.gzdest:/usr/local/mysql-{{MYSQL_VERSION}}.tar.gz-name:解压mysql安装包shell:tar-xf/usr/local/mysql-{{MYSQL_VERSION}}.tar.gz-C/usr/local-......
  • 手动安装LAMP——在 CentOS 7 上安装 PHP、Apache 和 MariaDB(替代 MySQL)
    在CentOS7上安装PHP、Apache和MariaDB(替代MySQL)的过程如下:1.更新系统:sudoyumupdate2.安装Apache:sudoyuminstallhttpd3.启动Apache服务并设置开机自启:sudosystemctlstarthttpdsudosystemctlenablehttpd4.安装MariaDB:sudoyuminstallmariadb-server......
  • MySQL哪些操作会记录至Binlog文件?
    参考:MySQL哪些操作会记录至Binlog文件?操作影响行数为0会写Binlog?https://juejin.cn/post/7066724038999015432Row模式下,会记录所有执行成功且返回的影响行数大于0的DDL和DML操作,当UPDATE和DELETE操作的影响行数为0时不会记录操作至Binlog。有如下疑问:mysql数据库没......
  • 连接MySQL报错{"Authentication to host 'PC10103' for user 'root' using method &#
    连接MySQL报错{"Authenticationtohost'PC10103'foruser'root'usingmethod'sha256_password'failedwithmessage:Accessdeniedforuser'root'@'PC10103'(usingpassword:YES)"}先在MySQL中执行如下查询SEL......
  • MySQL账号锁定与解锁
    MySQL提供了多种方法来锁定解锁账号,下面是几种常用的方法:1.使用ALTER语句锁定账号锁定账号:ALTERUSER'username'@'localhost'ACCOUNTLOCK;解锁账号:ALTERUSER'username'@'localhost'ACCOUNTUNLOCK;2.使用UPDATE语句锁定账号锁定账号:UPDATEmysql.userSETacco......
  • mysql 索引优化2
    对于关联sql的优化关联字段加索引,让mysql做join操作时尽量选择NLJ算法小表驱动大表,写多表连接sql时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式,省去mysql优化器自己判断的时间 in和exsits优化原则:小表驱动大表,即小的数据集驱动大的数据集in:当B表的......
  • MySQL:SQL 错误 [1118] [42000]: Row size too large.
    1.场景:今天在用MySQL建表的时候,报了一个错误;SQL错误[1118][42000]:Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludesstorageoverhead,checkthemanual.YouhavetochangesomecolumnstoTEXTor......
  • MySQL运维4-Mycat入门
    一、mycat概述mycat是阿里巴巴企业下的开源的,基于JAVA语言编写的MySQL数据库中间件,可以像使用MySQL一样来使用Mycat,对于开发人员来说根本感觉不到mycat的存在。之前在国内使用数据库分库分表,读写分离最主流的就是使用mycat,但是截止到今日2023-12-13日,mycat的网站的下载链接......
  • mysql的备份方法详解
    MySQL数据库备份是确保数据安全的重要步骤。有多种备份方法可用,以下是几种常见的MySQL备份方法:1.使用mysqldump命令行工具:mysqldump是MySQL提供的备份工具,通过命令行使用。以下是基本的备份和恢复示例:备份整个数据库:mysqldump-uusername-pdatabase_name>backup.sql......
  • JavaWeb - day07 - MySQL - DQL、多表设计
    01.MySQL-DQL-基本查询介绍DQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录。查询关键字:SELECT查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP......