美文网首页爱编程,爱生活
Mysql 删除数据之后,数据文件瘦身

Mysql 删除数据之后,数据文件瘦身

作者: 熬夜的猫头鹰 | 来源:发表于2018-06-16 23:43 被阅读32次

mysql 删除数据之后,数据文件瘦身

问题背景

当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。OPTIMIZE TABLE 是指对表进行优化。如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 。OPTIMIZE TABLE 命令只对 MyISAMBDBInnoDB表起作用 。表优化的工作可以每周或者每月定期执行,对提高表的访问效率有一定的好处.

但是需要注意的是,优化表期间会锁定表,所以一定要安排在空闲时段进行

在正常的运维中,如果开通了innodb_purge_threads = 1 参数 ,可以不用手动的执行OPTIMIZE TABLE 命令。
是否开启执行下列命令:看看value字段是否为1

show variables like '%innodb_purge%';

字段解释 : InnoDB中的清除操作是一类定期回收无用数据的操作。在之前的几个版本中,清除操作是主线程的一部分,这意味着运行时它可能会堵塞其它的数据库操作。在5.5版本中将其独立出来。

在进行大量的删除操作之前可以查看一下表空间的利用程度:


select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,
       concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB 
from tables 
where table_schema='?' 
and table_name='?';

删除之后,执行

执行命令:

show table status like 'table_name';

  • Name
    表名称
  • Engine:
    表的存储引擎
  • Version:
    版本
  • Row_format
    行格式。对于MyISAM引擎,这可能是Dynamic,Fixed或Compressed。动态行的行长度可变,例如Varchar或Blob类型字段。固定行是指行长度不变,例如Char和Integer类型字段。
  • Rows
    表中的行数。对于非事务性表,这个值是精确的,对于事务性引擎,这个值通常是估算的。
  • Avg_row_length
    平均每行包括的字节数
  • Data_length
    整个表的数据量(单位:字节)
  • Max_data_length
    表可以容纳的最大数据量
  • Index_length
    索引占用磁盘的空间大小
  • Data_free
    对于MyISAM引擎,标识已分配,但现在未使用的空间,并且包含了已被删除行的空间。
  • Auto_increment
    下一个Auto_increment的值
  • Create_time
    表的创建时间
  • Update_time
    表的最近更新时间
  • Check_time
    使用 check table 或myisamchk工具检查表的最近时间
  • Collation
    表的默认字符集和字符排序规则
  • Checksum
    如果启用,则对整个表的内容计算时的校验和
  • Create_options
    指表创建时的其他所有选项
  • Comment
    包含了其他额外信息,对于MyISAM引擎,包含了注释徐标新,如果表使用的是innodb引擎 ,将现实表的剩余空间。如果是一个视图,注释里面包含了VIEW字样

注意一下这个Data_free这个字段。

执行如下命令进行优化整理碎片

OPTIMIZE TABLE 【table_name】

在执行一看看表空间大小。


select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,
       concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB 
from tables 
where table_schema='?' 
and table_name='?';

执行命令:

show table status like 'table_name';

前后对比一下Data_free 这个字段,就知道这个效果了。

相关文章

网友评论

  • 青水山:optimize  table tb; 会回收空间,在数据目录下,会生成一个临时ibd,大小同原始ibd。(就算终止optimize ,依然会产生该临时ibd,大小同原始 ibd )

         truncate table tb;                  会回收空间

         alter table tb engine=innodb;   会回收空间

本文标题:Mysql 删除数据之后,数据文件瘦身

本文链接:https://www.haomeiwen.com/subject/rhdieftx.html