我正在阅读关于在这里重构一个大的慢速SQL查询,并且当前最高的响应来自Mitch Wheat,他希望确保查询使用主要选择的索引,并提到:
我要做的第一件事是检查以确保定期运行活动索引维护作业.如果没有,则重建所有现有索引,或者如果不可能,至少更新统计信息.
我只是业余DBA,而且我已经制作了一些自由职业者,基本上是Java桌面客户端,偶尔也是MySQL后端.当我设置系统时,我知道要在将要查询的列上创建索引,有一个varchar CaseID和一个varchar CustName.
但是,我在几个月前设置了这个系统并让客户端运行它,我相信索引应该随着数据的输入而增长,我相信一切都还能正常运行.我担心这些索引应该定期重建,因为今天我已经读到应该有一个"主动维护工作".我设置的唯一维护工作是夜间备份.
我想向社区询问数据库可能需要的定期维护.是否需要重建索引?我可以信任MySQL后端,只要没有人对它感到困惑并且数据保持在几千兆字节之内吗?
没有必要'重建'索引.它们始终保持最新状态.也许他指的是重建桌子.根据您的使用模式和架构,您可以在InnoDB中获取碎片页面,我想在MyISAM中也是如此.重建表可以通过消除磁盘上的数据碎片来提高性能.我不定期使用MyISAM表,但我相信建议使用某些使用模式运行'OPTIMIZE TABLE'.有关MyISAM和InnoDB的一些好信息,请参阅OPTIMIZE TABLE上的MySQL文档.
我对MyISAM的复杂性并不熟悉,但对于InnoDB,统计数据可能已经过时了.数据库保存有关如何为给定索引分配数据的估计统计数据,并且这些数据可能已过时,但MySQL/InnoDB具有一些内置功能,可以使统计数据保持最新状态.你通常不必担心它.
因此,如果您使用InnoDB,答案是否定的,您通常不需要主动执行任何操作来保持索引的良好运行.我对MyISAM不太确定,我认为需要定期优化这些表格更为常见.
设置cronjob以优化索引并检查错误通常是个好主意.
请参阅mysqlcheck.典型的cron作业看起来像是mysqlcheck -Aaos
,它会检查所有数据库中的所有表是否存在错误,优化索引,并且仅在出错时输出.