在线上数据库报警说空间快满了,于是开发直接执行delete操作。
delete from table_name t where t.create_time > '2021-03-21'
结果发现空间并没有释放。什么原因呢?
DELETE
包含约束条件的执行的sql:
delete from table_name t where 约束条件
不会立即删除数据,会标记数据,但不会释放空间。
如果需要立即释放空间,需要optimize命令:
optimize table table_name
备注: 执行optimize命令时,MySQL会锁定表。因此要在数据量少时再做处理。
不包含约束条件的sql:
delete from table_name
可以立即删除数据。
DROP
执行的sql:
drop table table_name
执行操作后可以立即释放空间。
TRUNCATE
执行的sql:
truncate table 表名
可以立即释放空间。
至于原因,后续需要做进一步的探究学习。

当线上数据库空间不足时,开发人员尝试通过执行DELETE语句清理数据,却发现空间未被释放。这是因为DELETE操作会标记数据而非立即删除,需要使用OPTIMIZE TABLE来释放空间。相比之下,DROP TABLE和TRUNCATE TABLE则能立即释放空间,但前者会永久删除表,后者仅清空表内容。了解这些命令的区别对于有效管理数据库空间至关重要。
975

被折叠的 条评论
为什么被折叠?



