mysql delete 数据之后 .MYD文件大小没有发生变化
mysql delete 数据之后 .MYD文件大小没有发生变化
介绍:
delete只是将数据标识为删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间。(当DELETE后面跟条件的时候 是这种情况,不跟条件直接delete的时候,则不会有这种情况)如
delete from table_name和delete from table_name where 不带条件的语句清空了表,myd文件大小为0;但是带条件的删除了整个表以后,myd和文件的大小不变。举个例子,100个程序员辞职走了,但是公司100个职位还在,没有撤销,需要等新的程序员进来蹲这些坑,但是呢,招到一个合适程序员需要时间,大多数时间,这个位置就空在那里了。文件大小没变原因,这是因为删除操作后在数据文件中留下碎片所致,当你删除数据 时,mysql并不会回收被已删除数据的占据的存储空间,以及索引位。
解决办法:
1.扩充单表容量
先查看表的状态:show table status like 'table_name',然后修改表的容量:alter table_name max_rows=2000000000000,avg_low_length=500000。
如图:
2.释放表空间
执行 SHOW TABLE STATUS
返回的记录中有一个 Date_free 字段.它显示的是 MyISAM 的表浪费空间.
如图:
上图所示,我是删除了80%的历史日志,但是myd文件大小没有变化,如下图:
使用 OPTIMIZE TABLE 指令可以优化它.
OPTIMIZE TABLE 是指对表进行优化。如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 。OPTIMIZE TABLE 命令只对 MyISAM 、 BDB 和 InnoDB 表起作用 。表优化的工作可以每周或者每月定期执行,对提高表的访问效率有一定的好处,但是需要注意的是,优化表期间会锁定表,所以一定要安排在空闲时段进行。
执行:
OPTIMIZE TABLE table_name;
成功以后,data_free如图:
文件改变如图: