mysql突然忽略了一段时间的表索引

时间:2015-05-15 13:33:32

标签: mysql database

在我们的mysql 5.1服务器上是一个名为innodb的表,它是我们的Web应用程序的核心。由于实施不当,它有大约150,000行和太多列。

最近我们一直在运行一个每隔几秒钟更新一次表(INSERT或UPDATE)的任务。

当该任务正在运行时,数据库将定期(每隔1-3个小时)变得更慢以处理客户端读取请求。在那些时候,slow_log指向这个表作为罪魁祸首,任何对它的请求看起来都像是在进行全表扫描。最终,它会在5到20分钟内自行完成并恢复正常处理。

我的假设是,常量表更新会偶尔抛出mysql的查询优化器统计数据。我不知道如何证明或找到解决方案。

以下是原因吗?

  1. 桌子上有太多的二级指数(有45个,很多 不必要的,但需要时间和精力去修剪)
  2. 错误的配置参数(query_cache为ON且innodb_buffer为5G)
  3. Mysql 5.1已过时,应该升级
  4. 数据库服务器可能只需要更多RAM / CPU来处理负载
  5. 我非常乐意提供您在评论中可能要求的任何其他信息。

1 个答案:

答案 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来处理   负载

我们可以在这里说同样的话,但我会优先考虑数据库设计和优化查询。