【MySQL学生手册】表维护操作类型

本文地址:https://www.askmac.cn/archives/mysql-maintenance-type.html

 

第10章 表的维护

 

章节概述

本章介绍如何在MySQL中进行表的维护管理。你会了解:

  • 分辨表维护操作类型
  • 执行表维护SQL语句
  • 使用客户端及工具程序来进行表维护
  • 修理InnoDB表
  • 启用对MyISAM表的自动修复

 

10.1 表维护操作类型

一些表维护操作对于判定并修正数据库中的问题(例如,当一张表由于服务器奔溃而导致损坏后)或帮助MySQL优化表查询时非常有用。MySQL(根据存储引擎)可允许你执行几种类型的维护操作:

存储引擎名 MyISAM InnoDB
CHECK TABLE 完整检查更新索引统计信息 完成检查
REPAIR TABLE 修理讹误表 N/A
ANALYZE TABLE 更新索引统计信息 更新索引统计信息
OPTIMIZE TABLE 回收被浪费的空间表碎片整理索引页排序

更新索引统计信息

表重建(MySQL 5.7.4以后部分使用了online DDL的机制避免了表拷贝)

10.1.1 分析和优化

对于表分析和优化操作,你可能希望定期执行以保持你的表一直处于最佳状态:

  • 当MySQL对一张MyISAM或InnoDB表进行分析时,它会更新其索引统计信息。优化器之后在处理查询时会使用这些统计信息,以便对如何最佳地查询表记录、表连接时读取表的顺序等做出更佳的判定。
  • 当MySQL优化了一张MyISAM表,它会对数据文件中的碎片进行整理以回收未使用的空间,排序索引,并更新索引统计信息。定期进行表碎片整理有助于加快包含有非定常列(如VARCHAR, VARBINARY, BLOB或TEXT)的表的访问,在此类表中进行频繁地插入或删除会导致存留许多空间间隙。碎片整理能有效降低这些间隙。

 

对于那些已经被填入数据并在之后一时不会再被修改的表,表分析和优化操作无疑对之后那些对此表进行的查询有最大的好处。随着表持续被更新修改,这些好处将被逐渐削弱,因此你需要定期地重复进行这类分析和优化操作。

 

表维护清理所用的工具包括有SQL语句如CHECK TABLE和REPAIR TABLE,客户端程序如mysqlcheck, myisamchk等工具,以及服务端对于自动恢复的能力。之后我们对这些工具进行介绍。

 

10.2 用于表维护操作的SQL语句

MySQL有几种SQL语句来进行表维护:CHECK TABLE用于完整性检查,REPAIR TABLE用于表修理,ANALYZE TABLE进行分析,OPTIMIZE TABLE被用于优化。本节中我们会重点对这些SQL语句进行讲解。

 

每个语句,当被发出后,服务端就会根据所需的操作进行执行。其中语句会接受一个或多个表名,或者可选的关键字来对基本的操作进行调整。一个表前一个不指定数据名来隐式指明为当前库下的表,或以db_name.table_name形式指定所要操作的数据库下的表。例如,如果world为当前数据库,以下语句等同于指导服务端对world.City表进行检查:

mysql> CHECK TABLE City;
mysql> CHECK TABLE world.City;

在执行完所要求的操作后,服务端返回操作结果信息,信息结果行分四列:

  • Table: 被处理的表
  • Op: 被执行的操作(check, repair, analyze或optimize)
  • Msg_type: 指提示成功或失败的返回信息类别。
  • Msg_text: 提供额外信息。

 

10.2.1 CHECK TABLE

CHECK TABLE语句可对表结构和内容进行完整性检查。它可用于MyISAM表和InnoDB表。对于MyISAM表,它还会对索引统计信息进行更新。如果进行检查的对象是一张view,CHECK TABLE语法也会对此视图的定义进行验证。当CHECK TABLE对于表的检查返回了一些问题,那么这张表就需要进行修复。

 

例如,在进行表修复前,CHECK TABLE语句应该被用于探测硬件问题(如,ram坏损,磁盘坏道等)。

简单语法如下:

CHECK TABLE <table_name> [, <table_name>] ;

 

10.2.2 REPAIR TABLE

REPAIR TABLE语句被用于修复表中的讹误问题。它仅可用于MyISAM,ARCHIVE及CSV表。当然,你也可以让服务端来自动对MyISAM表进行修复。

 

例如,当一次非正常关机(断电)或MyISAM表存在讹误的行时,可以使用REPAIRE TABLE语句进行恢复。

简单语法:

REPAIR TABLE <table_name> [, <table_name>] ;

 

10.2.3 ANALYZE TABLE

ANALYZE TABLE语句会更新表中关于键值分布的统计信息。这些信息被优化器用来对执行计划做出更佳判定。语句可用于MyISAM和InnoDB表。

 

简单语法:

ANALYZE TABLE <table_name> [, <table_name>] ;

 

10.2.4 OPTIMIZE TABLE

OPTIMIZE TABLE语句可以对MyISAM表进行碎片清理。清理会涉及对由于删除、更新、合并记录而造成的存储不连续(空间空隙)进行整理,回收这些不被使用的空间碎片。OPTIMIZE TABLE 也会对无序的索引页进行排序并,更新索引统计信息。

例如,使用OPTIMIZE TABLE语句来对表进行整理,简单语法:

OPTIMIZE TABLE <table_name> [, <table_name>] ;

 

对于每种存储引擎的命令匹配:

OPTIMIZE TABLE可作用于InnoDB表,但是其本质是匹配使用ALTER TABLE语句来实现表的重建。优化命令也会更新索引统计信息并释放簇索引中的闲置空间。

 

通过之前例子中的Note: Table does not support optimize, doing recreate + analyze instead,我们可以将作用于InnoDB表的OPTIMIZE TABLE底层实现理解为:

mysql> alter table City force;
mysql> analyze table City;

或是

mysql> alter table City engine=InnoDB;
mysql> analyze table City;

 

OPTIMIZE TABLE也可以运作于其他引擎表,不过其实现是通过执行匹配的ALTER TABLE命令来完成的,且一般情况下OPTIMIZE TABLE并不支持其它存储引擎,你需要在MySQL服务端启动时启用--skip-new项来启用支持。

 

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号