我正在计算表中字符的排名。无论出于什么原因,只要我用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;
任何帮助都将不胜感激!
编辑:
基本上,每个角色都有一个独特的工作,我想得到该角色的工作排名。排名的默认顺序是“按级别”。这就是为什么我要在我的职位排名中做一个比较。
下面是我期望结果的一个例子:期望结果
1条答案
按热度按时间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行),然后看看这是否起作用。