在我们的 mysql 5.1 服务器上有一个名为 innodb 的表,它是我们 web 应用程序的核心。由于实现不当,它有大约 150,000 行和太多的列。
最近我们一直在运行一个每隔几秒频繁更新一次表(INSERT 或 UPDATE)的任务。
当该任务运行时,数据库将定期(每 1 - 3 小时)变得更慢以处理客户端读取请求。在那段时间里,slow_log 将这个表指向罪魁祸首,对它的任何请求看起来都像是在进行全表扫描。最终,它会在 5-20 分钟内自行解决并恢复正常处理。
我的假设是,持续的表更新每隔一段时间就会使 mysql 的查询优化器统计信息失控。我不知道如何证明这一点或找到解决方案。
可能是以下原因吗?
- 表中二级索引太多(大约有 45 个,很多 不必要,但需要时间和注意修剪掉)
- 错误的配置参数(query_cache 开启且 innodb_buffer 为 5G)
- Mysql 5.1 已过时,需要升级
- 数据库服务器可能只需要更多 RAM/CPU 来处理负载
我非常乐意提供您可能在评论中要求的任何其他信息。
最佳答案
Can the following be the causes?
Too many secondary indices on the table (there are ~45, many unnecessary but will take time and care to prune away)
是的,如果您正在运行一项任务,女巫会执行大量插入/更新操作,那么肯定会在该表中拥有大量索引会使 sql 引擎过载。考虑到对于每次插入/更新,sql 都必须为 each 索引执行相同的插入。尽量只保留那些真正需要的索引。 And only if the amount of selects is bigger than the insert statements.
Bad configuration parameters (query_cache is ON and innodb_buffer is at 5G)
是的,query_cache 是否有帮助,这取决于专用于它的 ram 数量 (query_cache_size) 以及您的服务器拥有的 ram 总量。最好是分配少量,检查性能,增加数量,再次检查是否更好等等。 其他选项,如 key_buffer(重要!如果你有这么多索引)可能是决定性的。
Mysql 5.1 is outdated and should be upgraded
当然,升级很重要,而且通常会提高性能,但我不希望这能解决问题。
The database server probably just needs more RAM/CPU to handle the load
我们可以在这里说同样的话,但我会优先考虑数据库设计和优化查询。
关于mysql突然暂时忽略表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260854/