为什么执行了删除语句后mysql内存无变化?
mysql有InnoDB 存储引擎和MyISAM 存储引擎
该问题主要出现在InnoDB 存储引擎中,MyISAM 执行delete命令会直接删除记录并释放空间
InnoDB 存储引擎在
-
执行 delete 命令时,InnoDB 并不会立即从磁盘中擦除数据,而是通过以下步骤处理:
-
标记删除:将记录标记为“已删除”,并保留在存储页中。
-
Purge 线程清理:后台的 Purge 线程异步回收被标记的记录空间,但这些空间仍保留在表中供后续插入重用,不会立即释放给操作系统。
-
MVCC 支持:已删除的记录可能仍对未提交的事务可见(通过 Undo Log 实现多版本控制)。
-
-
数据残留风险:
-
被删除的数据在磁盘文件中仍可能以碎片形式存在,直到被新数据覆盖。
-
通过工具(如数据恢复软件)可能恢复未覆盖的残留数据。
-
在 InnoDB 中,默认情况下删除的数据并不会立即从磁盘擦除,而是通过标记删除和后台清理机制延迟释放空间。
如果想快速释放空间
可以手动执行 OPTIMIZE TABLE
OPTIMIZE TABLE your_table; -- 对 InnoDB 表会重建文件
强制重建表,回收碎片空间(适用于 DELETE
后的清理)
但是执行该命令有一定风险
1,表锁
重建表和索引需要复制数据,可能导致长时间锁定。
2,高资源消耗
-
I/O 压力:
重建表需要大量磁盘读写,可能导致I/O瓶颈,影响其他查询性能。 -
CPU 和内存占用:
数据排序和索引重建会消耗大量计算资源,可能拖慢整个数据库。
3,数据损坏缺失风险
-
操作中断:
若在优化过程中发生服务器崩溃、断电或强制终止进程,可能导致表损坏。 -
文件系统错误:
在复制或替换表文件时,若文件系统出现错误,可能破坏数据完整性。