应该何时重建数据库索引?

时间:2008-11-26 17:12:40

标签: mysql indexing maintenance

我正在阅读关于重构here的大型慢速SQL查询,目前最高的响应来自Mitch Wheat,他希望确保查询使用主要选择的索引,并提及:

  

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

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

但是,我在几个月前设置了这个系统并让客户端运行它,我相信索引应该随着数据的输入而增长,我相信一切都还能正常运行。我担心这些索引应该定期重建,因为今天我已经读到应该有一个“主动维护工作”。我设置的唯一维护工作是夜间备份。

我想向社区询问数据库可能需要的定期维护。是否需要重建索引?我可以信任MySQL后端,只要没有人混淆它并且数据保持在几千兆字节之外就可以继续吗?

3 个答案:

答案 0 :(得分:24)

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

我对MyISAM的复杂性并不熟悉,但对于InnoDB,统计数据可能已经过时了。数据库保存有关如何为给定索引分配数据的估计统计数据,并且这些数据可能已过时,但MySQL / InnoDB具有一些内置功能,可以使统计数据保持最新状态。你通常不必担心它。

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

答案 1 :(得分:11)

通常最好设置一个cronjob来优化索引并检查错误。

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

答案 2 :(得分:2)

您与“常规维护”相关联的答案是在临时表的特定上下文中,该表经常被截断并重新填充。您不需要对绝大多数MySQL数据库安装执行此操作。