mysql查询在执行order by和计数时永远不会完成

wwodge7n  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(363)

我正在计算表中字符的排名。无论出于什么原因,只要我用ORDERBY子句运行查询,它就会永远运行。
我有一个非常相似的查询,运行在不同的服务器上,使用不同的模式,但它基本上是做相同的事情,而且几乎是立即完成的。我完全不明白为什么这个问题永远不会结束,而且要花很长时间。
我几乎索引的字符表中的所有内容,但仍然没有运气。

KEY `accountid` (`accountid`),
KEY `party` (`party`),
KEY `ranking1` (`level`,`exp`),
KEY `ranking2` (`gm`,`job`),
KEY `idx_characters_gm` (`gm`),
KEY `idx_characters_fame` (`fame`),
KEY `idx_characters_job` (`job`),
KEY `idx_characters_level` (`level`),
KEY `idx_characters_exp` (`exp`),

当我不包括订单时,它运行良好,立即完成。当我这样做,它永远运行。
数据库中只有28000个字符,因此计算秩不会那么密集,特别是当限制仅为1时。

SELECT c.name
    , 1+(
      SELECT COUNT(*)
      FROM msd.characters as rankc
      WHERE rankc.level > c.level 
      LIMIT 1
    ) as jobRank
FROM characters as c
JOIN accounts as a
ON c.accountid = a.id
WHERE c.gm = 0 AND a.banned = 0
ORDER BY c.`level` DESC, c.exp DESC
LIMIT 1
OFFSET 0;

任何帮助都将不胜感激!
编辑:
基本上,每个角色都有一个独特的工作,我想得到该角色的工作排名。排名的默认顺序是“按级别”。这就是为什么我要在我的职位排名中做一个比较。
下面是我期望结果的一个例子:期望结果

pftdvrlh

pftdvrlh1#

当查询性能出现问题时,您应该做的第一件事是对查询运行explain(只需在select语句前面加上explain,您就可以看到https://dev.mysql.com/doc/refman/5.7/en/using-explain.html 更多细节)虽然你可能认为你已经准备好了所有合适的索引,有时dbms引擎所做的决定并不明显。如果发现一个或多个您认为会使用索引的完整表扫描(这可能是“query never finishes”问题最常见的来源),不要感到惊讶
更新:根据explain输出,查询正在子查询中执行多个完整表扫描,这可能是您的性能问题。您希望尝试使用索引获取子查询,因此我建议从子查询中删除limit 1(where子句过滤掉您不需要的级别,并且没有groupby子句,因此应该只返回1行),然后看看这是否起作用。

相关问题