在我们的mysql 5.1服务器上是一个名为innodb的表,它是我们的Web应用程序的核心。由于实施不当,它有大约150,000行和太多列。
最近我们一直在运行一个每隔几秒钟更新一次表(INSERT或UPDATE)的任务。
当该任务正在运行时,数据库将定期(每隔1-3个小时)变得更慢以处理客户端读取请求。在那些时候,slow_log指向这个表作为罪魁祸首,任何对它的请求看起来都像是在进行全表扫描。最终,它会在5到20分钟内自行完成并恢复正常处理。
我的假设是,常量表更新会偶尔抛出mysql的查询优化器统计数据。我不知道如何证明或找到解决方案。
以下是原因吗?
我非常乐意提供您在评论中可能要求的任何其他信息。
答案 0 :(得分:2)
以下是原因吗?
桌子上的次要指数太多(有45个,很多不必要,但需要时间和精心修剪掉)
是的,如果你正在运行一个任务,那么很多插入/更新确实在该表中有很多索引会使sql引擎超载。请注意,对于每次插入/更新,sql必须为每个索引执行相同的插入操作。尽量只保留那些真正需要的索引。并且只有当选择的数量大于插入语句时。
错误的配置参数(query_cache为ON且innodb_buffer为 在5G)
是的,query_cache可以帮助与否,它取决于专用于它的ram数量( query_cache_size )以及服务器拥有的总ram数量。最好是分配少量,检查性能,增加数量,再次检查是否更好等等。 其他选项,如 key_buffer (重要的是,如果您有这么多索引)可能是决定性的。
Mysql 5.1已过时,应该升级
当然,升级并提升性能当然很重要,但我不希望这样解决问题。
数据库服务器可能只需要更多的RAM / CPU来处理 负载
我们可以在这里说同样的话,但我会优先考虑数据库设计和优化查询。