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

《100个“反常识”经验11:删了30万行数据表还是那么大?》

本期摘要

你用DELETE删了30万行数据,df -h一看磁盘空间没变,表文件还是那么大。这不是Bug,是InnoDB存储引擎的设计特性:DELETE只标记删除,不释放磁盘空间,留下的位置叫“空洞”。真正释放空间需要执行OPTIMIZE TABLE或ALTER TABLE ENGINE=InnoDB。本文还提供了检查表碎片的SQL脚本,以及大表优化的工具推荐。

一次让人困惑的操作

业务需要清理半年前的日志数据,大概30万行。执行:

sql

DELETE FROM operation_logs WHERE created_at < '2026-01-01';

Query OK, 300000 rows affected。

再查表大小:

sql

SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb FROM information_schema.tables WHERE table_name = 'operation_logs';

结果:还是2GB,和删除前一样。

为什么DELETE不释放磁盘空间?

InnoDB存储引擎中,DELETE操作只是把数据行标记为“已删除”,并不会真正回收磁盘空间。这些空间称为“空洞”,后续INSERT可以复用,但文件大小不会缩小。

操作行为磁盘空间
DELETE标记删除,空间留作复用不释放
INSERT优先填充空洞不增加文件大小
TRUNCATE重建表释放
OPTIMIZE整理碎片释放

如何真正释放空间?

方法一:OPTIMIZE TABLE(推荐)

sql

OPTIMIZE TABLE operation_logs;

原理:重建表,消除空洞,回缩磁盘空间。

注意:执行期间会锁表,建议在业务低峰期操作。

方法二:ALTER TABLE重建

sql

ALTER TABLE operation_logs ENGINE=InnoDB;

效果和OPTIMIZE类似,也会重建表。

方法三:TRUNCATE(全删)

sql

TRUNCATE TABLE operation_logs;

删除所有数据并重置表,空间彻底释放。仅适用于全表删除。

真实案例对比

方法执行前表大小执行后表大小锁表耗时
DELETE 30万行2GB2GB行锁几秒
OPTIMIZE2GB1.2GB全表锁几分钟
TRUNCATE2GB0.1MB全表锁瞬间

注意事项

  • 频繁DELETE+INSERT会产生大量空洞,定期OPTIMIZE是必要的

  • 大表OPTIMIZE耗时较长,建议用pt-online-schema-change工具在线操作

  • 磁盘空间紧张时,不要只靠DELETE,记得跟进OPTIMIZE

一键检查表碎片脚本

sql

SELECT table_name, ROUND(data_length/1024/1024, 2) AS data_mb, ROUND(data_free/1024/1024, 2) AS free_mb, ROUND(data_free/data_length*100, 2) AS free_pct FROM information_schema.tables WHERE table_schema = 'your_database' ORDER BY free_pct DESC;

free_mb越大,碎片越严重,建议执行OPTIMIZE。

下期预告

《100个“反常识”经验12:死锁日志怎么看?10分钟学会》

http://www.jsqmd.com/news/701107/

相关文章:

  • 5分钟终极指南:一键解密网易云NCM音乐文件,免费高效转换音频格式
  • 【GPU程序员紧急预警】CUDA 13默认启用PTX JIT缓存机制,导致A100集群批量core dump?3步定位+2行代码修复方案
  • 【计算机毕业设计】基于Springboot的城镇保障性住房管理系统+LW
  • ARM CP15协处理器详解:寄存器配置与系统控制
  • 基于大语言模型的智能购物助手:从Agent原理到工程实践
  • 机器学习核心概念与实践指南
  • Jenkins Docker构建代理:标准化CI/CD环境与容器化实践指南
  • 深度解析:Zotero PDF Translate插件版本兼容性困境与架构级解决方案
  • NHSE:3步掌握《动物森友会》存档编辑,打造你的完美岛屿
  • 《每日一命令11:ps——一眼看穿所有进程》
  • 神经网络训练中的早停机制:原理与实践指南
  • KMS_VL_ALL_AIO智能激活工具:Windows与Office一键永久激活终极指南
  • Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案
  • 人工智能篇--- SSM 模型架构
  • 机器学习新手必备工具链与实战技巧
  • 抖音下载器终极指南:高效批量下载无水印视频的完整开源方案
  • Python实现多层感知机(MLP)手写数字识别实战
  • 支持向量机(SVM)原理与Python实战指南
  • Windows窗口管理效率革命:如何用AltSnap告别繁琐的标题栏点击
  • 机器学习堆叠泛化(Stacking)原理与Python实现
  • AI驱动的开发者智能助手:意图驱动的工程化任务自动化
  • jQuery Prettydate:实现日期格式化与美化
  • c++如何实现跨平台的文件读写进度监听器回调机制【实战】
  • 基于Git与纯文本构建个人知识库:极简笔记系统实践指南
  • MCP 2026权限爆炸风险预警:单租户超237个策略实例的崩溃临界点与动态裁剪算法
  • Weka机器学习算法性能评估全流程指南
  • 无需照片和 GPU,仅八个问题就能重建 3D 人体模型,效果还超棒!
  • 2026年靠谱的水暖温控器优质厂家推荐榜 - 行业平台推荐
  • Terraform实战进阶:从模块化到CI/CD的完整技能树构建
  • varlock:变量级版本感知锁在Go并发控制中的实践