> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/ji-chu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/ji-chu/mysql/sql-you-hua/cha-xun-you-hua/liang-ge-jian-dan-shi-yong-de-you-hua-fang-fa.md).

# 两个简单实用的优化方法

## 定期分析表和检查表

分析表的语法如下：

```sql
ANALYZE [ LOCAL | NO_WRITE_TO_BINLOG ] 
TABLE tbl_name [, tbl_name ] ...
```

本语句用于<mark style="color:blue;">**分析和存储表的关键字分布，分析的结果将可以使得系统得到准确的统计信息，使得 SQL 能够生成正确的执行计划**</mark>。如果用户感觉实际执行计划并不是预期的执行计划，执行一次分析表可能会解决问题。<mark style="color:blue;">**在分析期间，使用一个读取锁对表进行锁定**</mark>。这对于 MyISAM、BDB 和 InnoDB 表有作用。对于 MyISAM 表，本语句与使用 myisamchk -a 相当。

检查表的语法如下：

```sql
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
其中：
option = { QUICK | FAST | MEDIUM | EXTENDED | CHANGED }
```

检查表的作用是<mark style="color:blue;">**检查一个或多个表是否有错误**</mark>。CHECK TABLE 对MyISAM 和 InnoDB 表有作用。**对于MyISAM 表，关键字统计数据被更新**。

<mark style="color:orange;">**CHECK TABLE 也可以检查视图是否有错误，比如在视图定义中被引用的表已不存在。**</mark>

## 定期优化表

优化表的语法如下：

```sql
OPTIMIZE [ LOCAL | NO_WRITE_TO_BINLOG ] 
TABLE tbl_name [, tbl_name] ...
```

<mark style="color:orange;">**如果已经删除了表的一大部分数据，或者如果已经对含有可变长的行的表（含有 VARCHAR、BLOB 或TEXT 列的表）进行了很多更改，则应使用 OPTIMIZE TABLE 命令来进行表优化**</mark>**。这个命令可以将表中的空间碎片进行合并，并且可以消除由于删除或者更新造成的空间浪费**，但 OPTIMIZE TABLE 命令只对 MyISAM、BDB 和 InnoDB 表起作用。

> 对于 InnoDB 引擎的表来说，通过设置 <mark style="color:blue;">**innodb\_file\_per\_table**</mark> 参数，设置 InnoDB 为独立表空间模式，这样<mark style="color:blue;">**每个数据库的每个表都会生成一个独立的 ibd 文件，用于存储表的数据和索引**</mark>，这样可以一定程度上减轻 InnoDB 表的空间回收问题。另外，在删除大量数据后，InnoDB 表可以通过 ALTER TABLE 但是不修改引擎的方式来回收不用的空间：
>
> ```sql
> ALTER TABLE payment ENGINE = INNODB;   
> ```

{% hint style="danger" %}

## <mark style="color:red;">**警告**</mark>

**ANALYZE、CHECK、OPTIMIZE、ALTER TABLE 执行期间将对表进行锁定，因此一定注意要在数据库不繁忙的时候执行相关的操作。**
{% endhint %}
