我们在 Windows 2019 服务器(Dell R420、32 核、64GB、Raid10 上的 SSD)上运行 MySQL 8。我们的网站时不时会完全离线,因为 MySQL 服务器上的 CPU 完全处于瓶颈状态(CPU 100%)。
经过一番调查,我们发现这些查询堆积起来并且需要很长时间才能返回结果:
SELECT count(id)
FROM g3hy2_usergroups
这是一个非常简单的查询。它只返回该表上的用户组数。该表是 InnoDB,其表大小只有 80kB。
当我们手动运行此查询时,返回结果需要 0.037 秒,但在我们运行(例如)第 40 次之后,我们遇到了“错误”,并且需要永远返回结果(它实际上会永远运行,我怀疑直到达到 MySQL 超时)。
我不知道这是 MySQL 错误还是我们的数据库有问题或者是其他我们想不到的问题。
但我们希望有更深知识的人能给我们提示,以便我们能够朝着正确的方向前进,并更进一步解决这个问题。
顺便说一句,这不是硬件问题,因为我们已经尝试了不同的服务器,结果相同。
谢谢亚历克斯
答案1
一些可能有帮助的复合索引:
g3hy2_social_stream_item: INDEX(target_id, context_type, d.created)
g3hy2_social_stream_item: INDEX(target_id, created)
g3hy2_social_stream_item: INDEX(verb, context_type, created, context_id)
g3hy2_content: INDEX(cat_id, id)
这似乎毫无用处;如果可以的话,请摆脱它:
JOIN g3hy2_jreviews_content as jc ON c.id = jc.content
尝试使用以下命令将其移至派生表中UNION
:
GROUP BY p.listing_id
ORDER BY p.created DESC
LIMIT 20;
也就是说,尝试做LIMIT
前加入c
和jc
。这应该会降低这些连接的成本。
如果你成功完成上述任务,则将这 3 行移到 中SELECT
。UNION
参见http://mysql.rjweb.org/doc.php/index_cookbook_mysql#或
关于40份的摊位...它或许您有 40 个此查询的副本同时运行,并且它们相互干扰 - 共享 32 个核心。我上面的评论希望使查询运行得足够快,以防止高速公路拥堵。
(EXPLAIN
可能有助于分析。)