【问题标题】:MySQL query causing max connectionsMySQL查询导致最大连接数
【发布时间】:2012-11-06 00:29:24
【问题描述】:

我每 30 秒针对 MySQL 数据库运行一次以下查询:

SELECT message.id FROM message WHERE userto='13689' AND tstampviewed IS NULL AND message.status != 'VOID';

它经常出现在我的慢查询日志中,但在我看来它已经尽可能地优化了。

EXPLAIN 的结果:

SELECT_TYPE = 简单

TABLE = 消息

TYPE = 参考

POSSIBLE_KEYS = userto,tst,stat

KEY = userto

KEY_LEN = 53

REF = 常量

行 = 1

EXTRA = "在哪里使用"

键 userto、tst 和 stat 都是普通的 BTREE 索引,一个对应于查询 where 子句中引用的每个 varchar 字段。这是一个有 300K 行的 MyISAM 表。用户确实一致地写入表,但读取的可能性更大(读取与写入的比率为 10/1)。数据库服务器是 Windows 2008 Enterprise,具有大量 CPU 和快速驱动器。

在过去的一个月里,我们不断收到 max_connection 错误,尽管我将 max_connections 从 750 增加到 1500。一天几次,查询似乎挂起(我无法验证这一点,因为我没有访问权限实时到进程列表),1500个查询堆积在它后面并最大化连接。这显然会导致许多其他问题。

上述查询始终出现在慢查询日志中,尽管我认为它已尽可能优化。谁能告诉我其他情况或指出正确的方向来解决这个问题?

提前致谢。

【问题讨论】:

  • 您是否可能在 cron 作业中运行管理任务,例如 OPTIMIZE TABLEANALYZE TABLE?这些会停止其他查询,但不会显示在慢查询日志中。

标签: mysql optimization indexing


【解决方案1】:

问题不在于查询 - 您正在打开与数据库的连接而不是关闭它,而是每次打开一个新连接。

【讨论】:

  • 我们使用 mysql_connect 连接到每个 PHP 页面上的数据库。 PHP 应该在脚本结束时自动关闭连接。我们通常在任何给定时刻仅使用大约 20-30 个活动 MySQL 连接运行。一旦挂起的查询完成,连接就会回到平均范围。它不会增加(例如 - 它不会从 20 到 30 到 40 到 50 等)。当查询挂起时,它几乎立即从 20 个连接跃升至 1500 个。
  • 但查询不会创建连接,它会在您打开的连接上运行 - 我的意思是,除非 MySQL 中存在奇怪的错误,否则您在错误的位置查找。你确定你没有将页面重定向到自身、循环内的 MySQLconnect 或类似的东西吗?
  • 我可能不太清楚。 max_connection 问题是因为其他查询堆积在挂起的查询后面,等待它完成。我只是不明白为什么给定的查询可能需要 30 秒或更长时间才能运行。
  • 好的,我现在明白了!一个可能的问题是 MyISAM 使用表锁定 - 您是否可能有一个写入锁定表“消息”的点?另一种可能性是 - 它是否发生在特定的用户身上?也许有大量的比赛?另一个奇怪的事情是慢查询不应该阻止其他查询运行 - 这就是多个连接的用途!
  • 写入查询只会锁定它正在写入的表,对吗?我有 150 个数据库,都有一个“消息”表。这很奇怪,因为一个数据库上的查询不应该锁定另一个数据库上的查询。我没有任何一个数据库可以在 120 秒左右收集 1500 个连接。我无法弄清楚为什么连接会在一天中随机最大化。我猜查询不是问题,而是其他一些硬件/软件/未知故障!?我现在都不知道该去哪里找了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2017-05-31
  • 2014-08-30
  • 2012-08-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多