美文网首页爱编程,爱生活
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