MySQL 中的几个维护数据库表的语句

MySQL 提供了几个维护数据库表的语句:ANALYZE TABLEOPTIMIZE TABLECHECK TABLEREPAIR TABLE

定期的维护数据表是一个很好的习惯。对提高数据库的性能很有帮助。

MySQL 提供了几个维护数据库表的语句:

  • ANALYZE TABLE: 分析表
  • OPTIMIZE TABLE: 优化表
  • CHECK TABLE: 检查表
  • REPAIR TABLE: 修复表

分析表

MySQL 使用 ANALYZE TABLE 语句分析表,它用于分析和存储键的分布。分析表的结果将可以使得系统得到准确的统计信息,使得 SQL 能够生成正确的执行计划。

典型的,在一个表中进行了大量数据插入更新或者删除操作后,键分布可能是不准确的。如果键分布不准确,查询优化器可能会选择错误的查询执行计划,这可能会导致严重的性能问题。

如果你感觉实际执行计划并不是预期的执行计划,执行一次分析表可能会解决问题。

以下语句分析 Sakila 示例数据库中的 actor 表:

ANALYZE TABLE sakila.user;
+-------------+---------+----------+----------+
| Table       | Op      | Msg_type | Msg_text |
+-------------+---------+----------+----------+
| sakila.user | analyze | status   | OK       |
+-------------+---------+----------+----------+

您还可以一个语句中分析多个表,例如:

ANALYZE TABLE sakila.actor, sakila.film;
+--------------+---------+----------+----------+
| Table        | Op      | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| sakila.actor | analyze | status   | OK       |
| sakila.film  | analyze | status   | OK       |
+--------------+---------+----------+----------+

优化表

MySQL 使用 OPTIMIZE TABLE 语句优化表,它的主要作用是消除更新或者删除造成空间浪费。

典型的,在一个表中进行了大量数据更新或者删除操作后,表的物理存储可能变得碎片化。最总导致数据库服务器的性能下降。

以下语句优化 Sakila 示例数据库中的 film 表:

OPTIMIZE TABLE sakila.actor;
+-------------+----------+----------+----------+
| Table       | Op       | Msg_type | Msg_text |
+-------------+----------+----------+----------+
| sakila.film | optimize | status   | OK       |
+-------------+----------+----------+----------+

如果一个表不支持优化,MySQL 会给出一个 note 提示: Table does not support optimize, doing recreate + analyze instead。

检查表

数据库服务器可能发生一些错误,例如服务器意外关闭、向硬盘写入数据时出错等。这些情况可能导致数据库运行不正确,最坏的情况可能是崩溃。

MySQL 允许您使用 CHECK TABLE 语句检查数据库表的完整性。

以下语句检查 Sakila 示例数据库中的 actor 表:

CHECK TABLE sakila.actor;
+--------------+-------+----------+----------+
| Table        | Op    | Msg_type | Msg_text |
+--------------+-------+----------+----------+
| sakila.actor | check | status   | OK       |
+--------------+-------+----------+----------+

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

修复表

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

REPAIR TABLE 只支持 MyISAM 引擎。否则会给出提示: The storage engine for the table doesn’t support repair。

以下语句检查 Sakila 示例数据库中的 actor 表:

REPAIR TABLE sakila.actor;
+--------------+--------+----------+---------------------------------------------------------+
| Table        | Op     | Msg_type | Msg_text                                                |
+--------------+--------+----------+---------------------------------------------------------+
| sakila.actor | repair | note     | The storage engine for the table doesn't support repair |
+--------------+--------+----------+---------------------------------------------------------+

这里,由于我的数据引擎为 InnoDB,因此 MySQL 返回了提示。

总结

MySQL 提供了几个维护数据库表的语句 ANALYZE TABLEOPTIMIZE TABLECHECK TABLEREPAIR TABLE 分别用来分析表,优化表,检查表和修复表。