我在一个使用 MySQL 5.0 数据库和 InnoDB 表的大型 Web 应用程序上工作。在过去的几个月里,我们两次经历了以下情况:
- 数据库服务器运行良好数周,负载低且查询速度慢。
- 以前快速运行的频繁执行的查询将突然开始运行非常缓慢。
- 数据库负载峰值和站点挂起。
这两种情况的解决方案都是在慢查询日志中找到慢查询,并在表上创建一个新的索引来加速它。应用索引后,数据库性能恢复正常。
最令人沮丧的是,在这两种情况下,我们都没有对即将到来的厄运发出警告。我们所有的监控系统(例如,系统负载、CPU 使用率、查询执行率、慢查询)都告诉我们数据库服务器运行良好。
问题 1:我们如何预测或完全避免这些临界点?
我们没有定期做的一件事是运行 OPTIMIZE TABLE 或 ANALYZE TABLE。我们很难找到关于手动执行这些操作的频率(如果有的话)的良好经验法则。(由于这些命令 LOCK 表,我们不想不加选择地运行它们。)这些场景听起来像是未优化表的结果吗?
问题 #2:我们应该手动运行 OPTIMIZE 还是 ANALYZE?如果有,多久一次?
有关该应用程序的更多详细信息:数据库使用模式约为 95% 读取,5% 写入;数据库每秒执行大约 300 个查询;在这两种情况下,慢查询中使用的表是相同的,并且有数十万条记录。