mysql表空间回收

回收方法

    1. alter table tb_test engine=innodb;
    2. optimize table tb_test;
    3. gh-ost/pt-osc
    

alter table tb_test engine=innodb 原理介绍

        MySQL5.6 开始采用 Inplace 方式重建表,Alter 期间,支持 DML 查询和更新操作,语句为 alter table t engine=innodb, ALGORITHM=inplace;之所以支持 DML 更新操作,是因为数据拷贝期间会将 DML 更新操作记录到 Row log 中。

        重建过程中最耗时的就是拷贝数据的过程,这个过程中支持 DML 查询和更新操作,对于整个 DDL 来说,锁时间很短,就可以近似认为是 Online DDL。

        执行过程:

        1、获取 MDL(Meta Data Lock)写锁,innodb 内部创建与原表结构相同的临时文件

        2、拷贝数据之前,MDL 写锁退化成 MDL 读锁,支持 DML 更新操作

        3、根据主键递增顺序,将一行一行的数据读出并写入到临时文件,直至全部写入完成。并且,会将拷贝期间的 DML 更新操作记录到 Row log 中

        4、上锁,再将 Row log 中的数据应用到临时文件

        5、互换原表和临时表表名

        6、删除临时表


alter table、analyze table和optimize table区别

        alter table tb_test engine = innode;(也就是 recreate)就是 Online DDL 重建表过程;

        analyze table tb_test ; 不是重建表过程,它只是对索引信息重新统计,会上 MDL 读锁;

        optimize table tb_test ;是 alter table tb_test engine = innode; + analyze 过程。

OPTIMIZE TABLE 和ALTER TABLE xxxx ENGINE= INNODB哪个更好

        OPTIMIZE TABLE 还是ALTER TABLE xxxx ENGINE= INNODB基本上是一样的。但是在有些情况下,ALTER TABLE xxxx ENGINE= INNODB更好。例如old_alter_table系统变量没有启用等等。另外对于MyISAM类型表,使用ALTER TABLE xxxx ENGINE= INNODB是明显要优于OPTIMIZE TABLE这种方法的。

ALTER TABLE xxxx ENGINE= INNODB 表上的索引碎片会整理么

        ALTER TABLE ENGINE= INNODB,会重新整理在聚簇索引上的数据和索引。如果你想用实验验证,可以对比执行该命令前后index_length的大小。

        对于大表的重建,十分消耗 IO 和 CPU 资源。如果是线上服务,为了安全性考虑,建议使用 GitHub 开源的 gh-ost 来做。