时间:2023-10-30来源:系统城装机大师作者:佚名
在我们的生产环境中有一张表: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';
1 2 |
-- 清理磁盘碎片 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';
语句的查询效率,还是应当建立索引。
1 | alter ` ` table ` `ec_courier.courier_consume_fail_message `` add ` ` index ` `idx_service(service); |
到此这篇关于MySQL清理数据并释放磁盘空间的实现示例的文章就介绍到这了
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30