# 维护数据库表

在本教程中，我们将向您介绍一些非常有用的语句，使您可以在MySQL中维护数据库表。

MySQL提供了几个有用的语句，可以有效地维护数据库表。 这些语句使您能够分析，优化，检查和修复数据库表。

## 分析表语句

MySQL查询优化器是MySQL服务器的重要组成部分，为查询创建了一个最佳的查询执行计划。 对于特定查询，查询优化器使用存储的密钥分发和其他因素来决定在执行[连接](http://www.yiibai.com/mysql/inner-join.html)时应将表进行连接的顺序，以及哪个[索引](http://www.yiibai.com/mysql/create-drop-index.html)应用于特定表。

然而，密钥分发可能有时不准确，例如，在表中进行了大量数据更改(包括[插入](http://www.yiibai.com/mysql/insert-statement.html)，[删除](http://www.yiibai.com/mysql/delete-statement.html)或[更新](http://www.yiibai.com/mysql/update-data.html))之后。如果密钥分发不准确，则查询优化器可能会选择可能导致严重性能问题的错误查询执行计划。

要解决此问题，您可以为该表运行`ANALYZE TABLE`语句，例如，以下语句分析[示例数据库(yiibaidb)](http://www.yiibai.com/mysql/sample-database.html)中的`payments`表。如下所示 -

```sql
mysql> ANALYZE TABLE payments;
+-------------------+---------+----------+----------+
| Table             | Op      | Msg_type | Msg_text |
+-------------------+---------+----------+----------+
| yiibaidb.payments | analyze | status   | OK       |
+-------------------+---------+----------+----------+
1 row in set
```

如果运行`ANALYZE TABLE`语句后表没有变化，MySQL将不会再次分析表。 如果再次运行上述语句：

```sql
mysql> ANALYZE TABLE payments;
+-------------------+---------+----------+----------+
| Table             | Op      | Msg_type | Msg_text |
+-------------------+---------+----------+----------+
| yiibaidb.payments | analyze | status   | OK       |
+-------------------+---------+----------+----------+
1 row in set
```

当前表已经是最新的状态了。

## 优化表语句

在使用数据库时，可以进行许多更改，如[插入](http://www.yiibai.com/mysql/insert-statement.html)，[删除](http://www.yiibai.com/mysql/delete-statement.html)或[更新](http://www.yiibai.com/mysql/update-data.html)表中的数据，这可能会导致表的物理存储碎片化。因此，数据库服务器的性能下降。

MySQL提供了一个语句，允许您优化表以避免此碎片整理问题。 以下说明如何优化表：

```sql
OPTIMIZE TABLE table_name;
```

建议您对经常更新的表执行此语句。例如，如果要优化`orders`表进行碎片整理，可以执行以下语句：

```sql
mysql> OPTIMIZE TABLE orders;
+-----------------+----------+----------+-------------------------------------------------------------------+
| Table           | Op       | Msg_type | Msg_text                                                          |
+-----------------+----------+----------+-------------------------------------------------------------------+
| yiibaidb.orders | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| yiibaidb.orders | optimize | status   | OK                                                                |
+-----------------+----------+----------+-------------------------------------------------------------------+
2 rows in set
```

## 检查表语句

数据库服务器可能会发生错误，例如，服务器意外关闭，将数据写入硬盘时出错，等等。这些情况可能导致数据库运行不正确，并且在最坏的情况下可能会崩溃。

MySQL允许您使用`CHECK TABLE`语句检查数据库表的完整性。以下说明`CHECK TABLE`语句的语法：

```sql
CHECK TABLE table_name;
```

`CHECK TABLE`语句检查表及其索引。 例如，可以使用`CHECK TABLE`语句来检查订单表，如下所示：

```sql
CHECK TABLE orders;
```

执行上面语句，结果如下 -

```sql
mysql> CHECK TABLE orders;
+-----------------+-------+----------+----------+
| Table           | Op    | Msg_type | Msg_text |
+-----------------+-------+----------+----------+
| yiibaidb.orders | check | status   | OK       |
+-----------------+-------+----------+----------+
1 row in set
```

`CHECK TABLE`语句仅检测数据库表中的问题，但不会修复它们。要修复表，请使用`REPAIR TABLE`语句。

## 修复表语句

`REPAIR TABLE`语句允许您修复数据库表中发生的一些错误。 MySQL不保证`REPAIR TABLE`语句可以修复表所有可能的错误。

以下是`EPAIR TABLE`语句的语法：

```sql
REPAIR TABLE table_name;
```

假设`orders`表中有一些错误，需要修复它们，可以使用`REPAIR TABLE`语句，如下查询所示：

```sql
REPAIR TABLE employees;
```

MySQL返回表中所做的内容，并显示表是否已修复。

> 注： `REPAIR TABLE`方法仅适用于`MyISAM`，`ARCHIVE`和`CSV`表。

在本教程中，您已经学到了一些非常方便的语句来维护MySQL中的数据库表。
