mysql突然暂时忽略表索引

标签 mysql database

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

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

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

我的假设是,持续的表更新每隔一段时间就会使 mysql 的查询优化器统计信息失控。我不知道如何证明这一点或找到解决方案。

可能是以下原因吗?

  1. 表中二级索引太多(大约有 45 个,很多 不必要,但需要时间和注意修剪掉)
  2. 错误的配置参数(query_cache 开启且 innodb_buffer 为 5G)
  3. Mysql 5.1 已过时,需要升级
  4. 数据库服务器可能只需要更多 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/

相关文章:

database - 如何在postgresql中将数据从一个数据库复制到另一个数据库?

database - VIEW 与 SQL 语句的性能

mysql - 我想在 mysql 中创建一些带有索引和数据的特定列的表

php - SQL 表中的多维数组

php - mysql查询,使用字段作为列

php - 与学说 ORM (Symfony) 正确创建 ManyToMany 递归/自反关系

mysql - 在MySQL中,DELETE和UPDATE哪个更好?

php - 在重复键更新时使用 insert... 更新插入

MySQL 转储到 SQL Server 2008 R2

Mysql Doctrine2外键失败