mysql删除数据后释放磁盘空间

mysql删除数据后释放磁盘空间

drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ;

truncate table table_name立刻释放磁盘空间 ,不管是 Innodb和MyISAM;

delete from table_name 删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 ,而InnoDB 不会释放磁盘空间;

delete from table_name where xx 带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间;

delete操作后使用optimize table table_name 释放磁盘空间,优化表期间会锁定表,所以要在空闲时段执行optimize table ,测试十几个G数据的表执行optimize table 大概20多分钟。

注:delete删除数据的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。
OPTIMIZE TABLE命令优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片;该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能;但是具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。

使用optimize table table_name出现Table does not support optimize, doing recreate + analyze instead 的解决办法:

innodb的数据库不支持optimize,可以用 ALTER TABLE table.name ENGINE='InnoDB';对旧表以复制的方式新建一个新表,然后删除旧表。操作前最好备份表。
重新启动mysql ,在启动的时候指定–skip-new或者–safe-mode选项来支持optimize功能 再执行optimize table table_name

>/usr/local/mysql/bin/mysqladmin -uroot -p shutdown  --停止mysql
>/usr/local/mysql/bin/mysqld --skip-new &  --启动mysql
>mysql -uroot -p   --在服务器上连接mysql
mysql>use db_name;

删除数据并执行了optimize table释放了磁盘空间;optimize命令优化表 不要频繁操作,另外还发现执行optimize命令 Innodb 引擎的数据库下ibtmp1 文件由原来的几个Gy优化成12M了。
但如果数据每天都大量插入,删除数据后不执行optimize table, insert 数据的时候会占用已经删除那部分数据的空间,数据文件所占用的磁盘空间短时间并不会增长,所以要减少数据文件占用磁盘空间,可以对表进行压缩。



作者:扛着煤气去救火
链接:https://www.jianshu.com/p/ebe6ac68099a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。