数据库索引何时需要重建?

26
我正在阅读有关重构大型缓慢SQL查询的文章(这里),目前最高的响应来自Mitch Wheat,他想确保查询在主要选择中使用索引,并提到:

我要做的第一件事是检查是否定期运行活动索引维护作业。如果没有,请重建所有现有索引,或者如不可能,则更新统计信息。

我只是一位业余的数据库管理员,曾经做过几个基于Java桌面客户端和偶尔使用MySQL后端的程序。当我设置系统时,我知道要在将被查询的列上创建索引,其中包括一个varchar CaseID和一个varchar CustName。
然而,我是几个月前设置了这个系统并且由客户操作,我相信索引应该随着数据的输入而增长,而且我相信一切仍在正常运转。但是,我担心索引需要定期重建,因为今天我读到应该有一个“活动维护工作”。我在这个系统上设置的唯一维护工作是每晚备份。
我想问问社区一个数据库可能需要的常规维护。是否需要重建索引?如果没有人乱搞它并且数据保持在几GB以下,我可以相信MySQL后端继续运行吗?
3个回答

24

不需要“重新构建”索引,它们始终保持最新状态。也许他指的是重建表。根据您的使用模式和架构,在InnoDB中可能会出现碎片化的页面,我认为在MyISAM中也是如此。通过重建表,可以通过消除磁盘上数据的碎片化来提高性能。我不经常使用MyISAM表,但我相信在某些使用模式下建议使用'OPTIMIZE TABLE'。有关MyISAM和InnoDB的一些很好的信息,请参见MySQL文档中关于OPTIMIZE TABLE的内容。

我对MyISAM的细节不是很熟悉,但在InnoDB中确实存在统计数据过期的情况。数据库会保留有关给定索引下数据分布的估计统计信息,这些统计信息可能过时,但MySQL / InnoDB具有一些内置功能来尝试保持统计信息的最新状态。通常您不必担心它。

因此,如果您正在使用InnoDB,则通常不需要采取任何主动措施来保持索引的良好性能。对于MyISAM,我不太确定,我认为经常需要定期优化这些表。


1
从您的链接中可以看出:"如果您已删除表的大部分内容或对具有可变长度行的表进行了许多更改,则应使用OPTIMIZE TABLE"。看起来只有在发生了重大结构性更改时才需要运行OPTIMIZE。谢谢,看起来我不需要运行它。 - Karl

11

通常设置一个定时任务来优化索引和检查错误是一个好主意。

请参考mysqlcheck。一个典型的定时任务看起来像mysqlcheck -Aaos,它会检查所有数据库中的所有表格是否存在错误,优化索引,仅在发现错误时输出。


我没有访问机器的权限,而不会打扰客户并让他认为可能存在问题。我知道使用模式,并正在寻找有关何时需要优化的信息。 - Karl
说实话?我不会担心它的。 - Eli

1
关于“定期维护”的链接答案是针对一个经常被截断和重新填充的临时表的特定情境。大多数MySQL数据库安装不需要这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接