在介绍MySQL的检查、修复、分析、优化等知识点之前,先来了解下MySQL的命令行工具mysqlcheck:
mysqlcheck
mysqlcheck -u username -p password [-c/-r/-a/-o] dbname [tablename]
# -c check table tablename(检查表)
# -r repair table tablename(修复表)
# -a analyze table tablename(分析表)
# -o optimize table tablename(优化表)
更多见我的另一篇博客:
下面开始详细介绍下MySQL表的检查、修复、分析和优化:
一、check table(检查)
1.官网详解
https://dev.mysql.com/doc/refman/5.7/en/check-table.html
2.语法
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
3.作用
CHECK TABLE检查一个或多个表是否有错误。错误发生的原因有很多,例如:数据写入磁盘时发生错误,或是索引没有同步更新,或是数据库未关闭MySQL就停止了等等。
CHECK TABLE适用于 InnoDB, MyISAM, ARCHIVE,和 CSV表格。
对于MyISAM表,键统计信息也会更新;CHECK TABLE还可以检查视图是否存在问题,例如视图定义中引用的表不再存在;在运行之前CHECK TABLE对 InnoDB表;CHECK TABLE支持分区表,您可以ALTER TABLE … CHECK PARTITION用来检查一个或多个分区;
4.结果集解析
check table tablename;
正常情况如下:
Table | Op | Msg_type | Msg_text |
---|---|---|---|
dbname | check | status | OK |
字段解析:
字段 | 解析 |
---|---|
Table | 表名 |
Op | 总是check |
Msg_type | status,error, info,note,或 warning |
Msg_text | 信息性消息 |
注意:
对于MyISAM表,如果没有得到OK或Table is already up to date,通常应修复该表。Table is already up to date表示该表的存储引擎指示无需检查该表。
二、repair table(修复)
1.官网详解
https://dev.mysql.com/doc/refman/5.7/en/repair-table.html
2.语法
REPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
(1)NO_WRITE_TO_BINLOG或LOCAL
默认情况下,服务器将REPAIR TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选NO_WRITE_TO_BINLOG关键字或其别名LOCAL。
(2)QUICK
如果使用该QUICK选项,则 REPAIR TABLE尝试仅修复索引文件,而不修复数据文件。这种修复类似于myisamchk --recover --quick所做的修复。
(3)EXTENDED
如果使用该EXTENDED选项,MySQL将逐行创建索引,而不是通过排序一次创建一个索引。这种修复类似于myisamchk --safe-recover进行的修复。
(4)USE_FRM
USE_FRM如果.MYI索引文件丢失或其标题损坏,则可以使用 该选项。该选项告诉MySQL不信任.MYI 文件头中的信息,并使用.frm文件中的信息重新创建它 。使用myisamchk无法完成这种修复。
3.作用
REPAIR TABLE 仅对于某些存储引擎,修复可能损坏的表。
尽管通常不必运行 REPAIR TABLE,但是如果发生灾难,此语句很可能从MyISAM表中取回所有数据。如果您的表经常损坏,请尝试找出原因,以消除使用的需要REPAIR TABLE。
REPAIR TABLE检查表以查看是否需要升级。如果是这样,它将按照与相同的规则执行升级 CHECK TABLE … FOR UPGRADE。
REPAIR TABLE工程 MyISAM, ARCHIVE和 CSV表。对于 MyISAM表,默认情况下它与myisamchk --recover tbl_name具有相同的效果。该语句不适用于视图。
REPAIR TABLE支持分区表。但是,该USE_FRM 选项不能与分区表上的该语句一起使用。
您可以ALTER TABLE … REPAIR PARTITION用来修复一个或多个分区。
4.结果集解析
字段 | 解析 |
---|---|
Table | 表名 |
Op | 总是repair |
Msg_type | status,error, info,note,或 warning |
Msg_text | 信息性消息 |
三、analyze table(分析)
1.官网详解
https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html
2.语法
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
3.作用
ANALYZE TABLE执行键分布分析并存储一个或多个命名表的分布。对于MyISAM表,此语句等效于使用myisamchk --analyze。
该声明要求SELECT 和INSERT对表的权限。
ANALYZE TABLE有工作 InnoDB,NDB和 MyISAM表。它不适用于视图。
ANALYZE TABLE支持分区表,您可以ALTER TABLE … ANALYZE PARTITION用来分析一个或多个分区;
在分析过程中,该表已被锁定与读锁 InnoDB和MyISAM。
ANALYZE TABLE从表定义缓存中删除该表,这需要刷新锁。如果仍有长时间运行的语句或事务仍在使用该表,则后续的语句和事务必须等待这些操作完成才能释放刷新锁。因为ANALYZE TABLE它本身通常很快完成,所以显然看不到涉及同一表的延迟事务或语句是由于剩余的刷新锁引起的。
默认情况下,服务器将ANALYZE TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选 NO_WRITE_TO_BINLOG关键字或其别名 LOCAL。
4.结果集解析
字段 | 解析 |
---|---|
Table | 表名 |
Op | 总是analyze |
Msg_type | status,error, info,note,或 warning |
Msg_text | 信息性消息 |
四、optimize table(优化)
1.官网详解
https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html
2.语法
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
3.作用
OPTIMIZE TABLE重新组织表数据和关联索引数据的物理存储,以减少存储空间并提高访问表时的I / O效率。对每个表所做的确切更改取决于该表使用的 存储引擎。
4.结果集解析
字段 | 解析 |
---|---|
Table | 表名 |
Op | 总是optimize |
Msg_type | status,error, info,note,或 warning |
Msg_text | 信息性消息 |
OPTIMIZE TABLE表捕获并引发将表统计信息从旧文件复制到新创建的文件时发生的任何错误。例如。如果所有者的用户ID .frm,.MYD或 .MYI文件是从的用户ID不同的mysqld过程, OPTIMIZE TABLE除非生成一个“不能改变文件的所有权”错误 的mysqld由启动 root用户。
五、checksum table(校验和)
1.官网详解
https://dev.mysql.com/doc/refman/5.7/en/checksum-table.html
2.语法
CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED]
3.作用
CHECKSUM TABLE报告 表内容的校验和。您可以使用此语句来验证备份,回滚或其他旨在将数据恢复为已知状态的操作前后的内容是否相同。