-1
SELECT u.id, u.honour, COUNT(*) + 1 AS rank
FROM user_info u
INNER JOIN user_info u2
  ON u.honour < u2.honour
WHERE u.id = '$id'
  AND u2.status = 'Alive'
  AND u2.rank != '14'

这个查询目前完全减慢了我的服务器。它会根据您的荣誉计算出您在“user_info”表中的排名,该表将其存储在我们所有用户之外。

截图解释。

http://cl.ly/370z0v2Y3v2X1t1r1k2A

SELECT u.id, u.honour, COUNT(*)+1 as rank
FROM user_info u 
    USE INDEX (prestigeOptimiser)
INNER JOIN user_info u2 
    ON u.honour < u2.honour
WHERE u.id='3'
    AND u2.status='Alive'
    AND u2.rank!='14'
4

3 回答 3

1

首先,您应该添加一个group by子句,以便您的查询有意义。

其次,您应该更改状态列以保存整数以使索引更小。

第三,您应该像这样在 id 和 status 上创建一个索引:

alter table user_info add index idxID_Status (id, status)

最后,要获得排名,您应该看看这个答案。此外,您应该添加一种对它们进行排序的方法...获得没有顺序的排名并不是真正的排名。

于 2012-04-13T17:03:43.937 回答
1

我认为负载来自您的加入条件'<'。

您可以尝试拆分查询或(或者如果您更喜欢子查询)并使用荣誉索引进行计数。

SELECT id, honour INTO @uid, @uhonour
FROM user_info 
WHERE id = '$id';

SELECT @uid, @uhonour, COUNT(honour) + 1 as rank
FROM user_info
WHERE status = 'Alive'
AND rank != '14'
AND @uhonour < honour;
于 2012-04-13T17:51:28.440 回答
1

从解释中我们可以看出,MySQL 在这里使用了错误的索引。首先,只需删除所有索引并创建一个新索引,至少包含以下两个字段:IdHonour. 它应该会大大提高性能。

ALTER TABLE user_info ADD INDEX myIndex (id, honour);
于 2012-04-13T17:11:14.417 回答