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 数据的时候会占用已经删除那部分数据的空间,数据文件所占用的磁盘空间短时间并不会增长,所以要减少数据文件占用磁盘空间,可以对表进行压缩。