26

我在这里阅读了关于重构一个大型慢速 SQL 查询的信息,当前最高响应来自 Mitch Wheat,他希望确保查询使用主要选择的索引,并提到:

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

我只是一名业余 DBA,并且我已经制作了一些程序自由职业者,它们基本上是 Java 桌面客户端,偶尔也是 MySQL 后端。当我设置系统时,我知道要在将要查询的列上创建一个索引,有一个 varchar CaseID 和一个 varchar CustName。

然而,我在几个月前设置了这个系统并让客户端运行它,我相信索引应该随着数据的输入而增长,我相信一切仍然运行良好。我担心索引应该定期重建,因为今天我读到应该有一个“积极的维护工作”。我设置的唯一维护工作是每晚备份。

我想向社区询问数据库可能需要的定期维护。是否需要重建索引?只要没有人弄乱它并且数据保持在几千兆字节以下,我是否可以相信 MySQL 后端会继续运行?

4

3 回答 3

24

无需“重建”索引。它们始终保持最新状态。也许他指的是重建桌子。根据您的使用模式和架构,您可以在 InnoDB 中获得碎片页面,我认为在 MyISAM 中也是如此。重建表可以通过消除磁盘上的数据碎片来提高性能。我不经常使用 MyISAM 表,但我认为建议使用某些使用模式运行“OPTIMIZE TABLE”。有关MyISAM 和 InnoDB 的一些有用信息,请参阅OPTIMIZE TABLE上的 MySQL 文档。

我对 MyISAM 的复杂性不太熟悉,但对于 InnoDB,统计数据确实会过时。数据库保留有关给定索引的数据分布方式的估计统计信息,并且这些统计信息可能会过时,但是 MySQL/InnoDB 具有一些内置功能来尝试使统计信息保持最新。您通常不必担心它。

因此,如果您使用 InnoDB,答案是否定的,您通常不需要主动做任何事情来保持索引的良好性能。我对 MyISAM 不太确定,我认为需要定期优化这些表更为常见。

于 2008-11-26T18:11:24.857 回答
11

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

mysqlcheck。一个典型的 cron 作业看起来像mysqlcheck -Aaos,它检查所有数据库中的所有表是否有错误,优化索引,并且只输出错误。

于 2008-11-26T18:03:18.167 回答
1

您链接到的关于“定期维护”的答案是在临时表的特定上下文中,该表会定期被截断和重新填充。您不需要对绝大多数 MySQL 数据库安装执行此操作。

于 2008-12-10T05:04:31.447 回答