当前位置:首页 > 数据库 > MySQL > 正文内容

【已解决】MYSQL数据库删除表中部分数据后,空间仍不变。

virtualman2个月前 (07-23)MySQL193

目前项目中存在一张表,数据总行数4000w行,总大小6.7G。导致业务里面对此表的insert语句越来越慢,出现了慢查询堵塞情况,导致整个服务504了几分钟。

因此需要对此表进行delete处理。使用DELETE语句,删除ID<=2000w的数据。但在删除之后,发现数据表的总量仍没有改变,甚至还增大了一部分。

这主要是因为在数据库中,特别是对于如InnoDB这样的存储引擎,当执行DELETEUPDATE操作时,确实只会对被删除或更新的行做逻辑上的标记,并不会立即释放物理空间。这是为了保证事务的原子性和一致性,以及避免频繁的磁盘I/O操作,提高性能。因此,在大量删除数据后,虽然数据行减少了,但磁盘空间可能并未相应减少,甚至由于一些内部结构的调整(如页分裂)而增加。 

需要额外执行  optimize table `TABLENAME` 操作。

OPTIMIZE TABLE命令可以重新组织表的存储,回收由DELETETRUNCATE操作产生的未使用的空间,并且整理碎片。这个操作会重建表,将所有行重新插入到一个新的表中,同时清除所有被标记为已删除的行所占用的空间。这样,可以有效地减少表的大小并优化表的性能。

注意!,OPTIMIZE TABLE是一个比较耗时的操作,尤其是在大数据量的表上,它可能会占用大量的CPU、内存和I/O资源,因此最好在业务低峰期执行,以减少对在线服务的影响。

如果数据库系统支持,也可以考虑使用TRUNCATE TABLE来替代DELETE操作,特别是在要删除所有数据或者大部分数据的情况下,因为TRUNCATE会直接释放表的所有数据和索引空间,而不保留任何记录,这通常比DELETE更快速和更节省空间。

相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。