零:说在前面

众所周知,Oracle中,对于大量增删改操作的表需要定时进行表分析,以便回收被标记废弃的磁盘空间,缩减表的实际大小。对于异常状态的索引,也需要定时对索引进行重构。

MySQL中亦有类似需求。实现的命令有如下这些:ANALYZE、OPTIMIZE、CHECK、REPAIR。

 

一:索引的重建

第一步:SHOW INDEX

MySQL 显示结果 mysql 显示表_MySQL

通过命令,我们可以看到索引相关信息,同时可以通过对比这里的cardinality的值与表中索引列的行数以便确定是否存在索引异常,这里我们假设索引产生异常。那么执行分析命令。

 

第二步:Analyze

语法如下

MySQL 显示结果 mysql 显示表_数据_02

一般来说,执行完analyze之后,再次执行show index命令,会发现cardinality会有明显的变化,这说明执行成功了。

 

二:缩表

对于频繁增删改操作的表,会在磁盘上产生大量的被标记不可用的空间,但这部分空间不能写入新数据,同时记录于其上的数据一步可用。这就会产生碎片,造成磁盘的浪费,降低IO效率。我们要收回这部分空间,可以这么做

第一步:直接执行命令

MySQL 显示结果 mysql 显示表_MySQL 显示结果_03

如上图第二行所示,说明执行已成功。

具体效果,可以通过比对执行命令前后的表空间文件的大小得到。这里就不做示范了。

 

三:检查表

当MySQL数据库异常关闭或表异常关闭,或写入磁盘发生错误的时候,抑或索引同步失效,需要用到下面这个命令

CHECK,语法如下

MySQL 显示结果 mysql 显示表_数据_04

当被检查对象正确的情况下会显示如上图的效果,否则效果如下图所示

MySQL 显示结果 mysql 显示表_MySQL_05

 

四、REPAIR

这个功能,innodb不支持,而且在MySQL8.0以后,innodb已是主流并将逐渐取代MYISAM引擎,因此暂不对此功能做详细说明。

 

补充:

1:若开启了binlog,那么在Analyze的过程亦会写入日志。若不打算写入日志,命令中加入“local”即可,如下

local

2:Analyze的时候,MySQL会用一个读取锁锁定目标表。因此最好将这个工作放到业务量低的时间进行。

3:对于CHECK命令,还有以下的可选项

UPGRADE:用来测试在更早版本的MySQL中建立的表是否与当前版本兼容。
QUICK:速度最快的选项,在检查各列的数据时,不会检查链接(link)的正确与否,如果没有遇到什么问题,可以使用这个选项。
FAST:只检查表是否正常关闭,如果在系统掉电之后没有遇到严重问题,可以使用这个选项。
CHANGED:只检查上次检查时间之后更新的数据。
MEDIUM:默认的选项,会检查索引文件和数据文件之间的链接正确性。
EXTENDED:最慢的选项,会进行全面的检查。