【已解决】MYSQL数据库删除表中部分数据后,空间仍不变。
目前项目中存在一张表,数据总行数4000w行,总大小6.7G。导致业务里面对此表的insert语句越来越慢,出现了慢查询堵塞情况,导致整个服务504了几分钟。
因此需要对此表进行delete处理。使用DELETE
语句,删除ID<=2000w的数据。但在删除之后,发现数据表的总量仍没有改变,甚至还增大了一部分。
这主要是因为在数据库中,特别是对于如InnoDB这样的存储引擎,当执行DELETE
或UPDATE
操作时,确实只会对被删除或更新的行做逻辑上的标记,并不会立即释放物理空间。这是为了保证事务的原子性和一致性,以及避免频繁的磁盘I/O操作,提高性能。因此,在大量删除数据后,虽然数据行减少了,但磁盘空间可能并未相应减少,甚至由于一些内部结构的调整(如页分裂)而增加。
需要额外执行 optimize table `TABLENAME`
操作。
OPTIMIZE TABLE
命令可以重新组织表的存储,回收由DELETE
和TRUNCATE
操作产生的未使用的空间,并且整理碎片。这个操作会重建表,将所有行重新插入到一个新的表中,同时清除所有被标记为已删除的行所占用的空间。这样,可以有效地减少表的大小并优化表的性能。
注意!,OPTIMIZE TABLE
是一个比较耗时的操作,尤其是在大数据量的表上,它可能会占用大量的CPU、内存和I/O资源,因此最好在业务低峰期执行,以减少对在线服务的影响。
如果数据库系统支持,也可以考虑使用TRUNCATE TABLE
来替代DELETE
操作,特别是在要删除所有数据或者大部分数据的情况下,因为TRUNCATE
会直接释放表的所有数据和索引空间,而不保留任何记录,这通常比DELETE
更快速和更节省空间。