MySQL的delete操作与数据库空间

上周,我的朋友告诉我他在使用 MySQL 数据库时遇到了问题。
他说,删除记录并没有减少数据库空间,这让他感到困惑。

2 02 3 年,我发现MySQL的删除操作并没有直接减少数据库空间。
它只是给记录添加删除标记,并不会立即释放记录的实际存储位置。

朋友问我遇到这种情况该怎么办?我告诉他他可以使用可定制指令来释放空间。
但请注意,该命令仅对 MyISAM、BDB 和 InnoDB 表有效。

然后我问他是否考虑过使用 DROP 或 TRUNCATE 操作。
他表示,虽然drop操作可以删除整个表并释放空间,但它是不可逆的。
虽然TRUNCATE操作可以删除所有记录并释放空间,但它也会删除表中的所有数据。

最后,我建议他根据实际需要选择合适的操作,同时也适当控制删除操作的频率和方式,避免浪费空间。
闻言,他点了点头,说道:“就看你的了。

搞定面试官 - 为什么在 MySQL 中使用 Delete 删除数据之后,表数据文件大小为什么没变?

mysql表的data free过大

那天在地铁上,我看到一个朋友敲着手机屏幕,眉头紧锁。
我问他在做什么,他说数据库又报错了,表空间满了。
我随口问了一下datafree是不是太大了。
他愣了一下,表示好像在哪里听过这个词,但又说不出来是什么意思。
是的,看来这个问题需要认真讨论一下。

例如,上次我帮助邻居公司修复他们的数据库时,他们的空表不断增长,就像吹气球一样。
一开始以为是服务器出了问题,但检查后发现,表结构不断改变,添加列、删除列,没有任何改善。
想想看,如果删除一列,空间就会像水泼出去,无法恢复。
我对它们运行了 OPTIMIZETABLE,突然间,空间几乎减半了。
这件事发生在去年冬天。
当天北京气温为零下-5 度。
我拿着笔记本电脑在机房里踱步,看着命令行上的进度条。
我感觉很好。

再比如,有一个小餐馆的系统。
生意很忙。
每天有数十万次点餐和更改菜单的操作。
你猜怎么着?表变得碎片化,没有数据的大小是可怕的。
我问厨师是否每天都会清理菜单,他说没有,他只是在你点菜时总是加减菜品。
这就像每天把衣服从衣柜里拿出来再塞回去,直到衣柜门都快被卡住了。
我教他们每三到五次进行一次分析性运行,就像清扫衣柜一样。
虽然不能完全解决问题,但至少可以让系统更好的运行。
我记得这件事,也许今年春天,他们店里做饭的味道还留在我的脑海里。

更有趣的是,一旦我修复了旧系统,表索引就变得混乱了。
想想看,一开始我是想帮忙,但最后却被卷入其中。
索引就像树的树枝一样,越生长越乱,最后没有数据直接达到表总容量的一半。
我重新索引它们,这个过程真的很可怕。
至少最后完成了,厨师还请我吃了串。
炭火很旺,肉滋滋作响。
这是一年前的事了,现在想起来,串串还挺好吃的。

等一下,还有一件事,就是统计信息不正确的时候。
想一想,如果数据库认为你的表只有1 00条数据,但结果却发现实际上有1 0000条,那在查询数据时岂不是大海捞针?我见过一个项目,由于统计信息不正确,查询速度慢得像蜗牛。
老板很担心,想把数据库扔掉。
后来我教他们使用ANALYZETABLE,跑了几次,查询速度立刻变快了。
这件事发生在去年秋天。
那天晚上我加班完毕,回家的路上看到路灯把树叶照得金黄。

由于多种原因,免费数据已经变得巨大。
结构改变但没有优化,操作非常频繁,指数存在偏差,统计信息不正确。
这些都是可能性。
解决办法只有几种,包括OPTIMIZABLE、ANALYZABLE、删除索引、修改统计信息等。
归根结底还是要根据具体情况对症下药。
看看,这不是很有趣吗?

MySQL删除表数据,磁盘空间还一直被占用,为什么?

表文件不折叠是MySQL的一种设计机制。

删除仅标记要删除的数据,并不释放空间。

一旦标记了一页或一行数据,该空间就可以重复使用。

由于容量未进行碎片整理,因此文件大小不会改变。

使用 OPTIMIZETABLE 来缩小空间。

OPTIMIZETABLE 将对它进行碎片整理。

重建 ALERTABLE ENGINE=INNODB 表也是可能的。

OnlineDDL可以减少锁表的影响。

应在非高峰时段运行。