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'
此查询目前正在彻底减慢我的服务器速度。它会根据您的荣誉计算出您在“用户信息”中的排名。表格存储了我们所有的用户。
解释屏幕截图。
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'
答案 0 :(得分:1)
首先,您应该添加group by
子句,以便查询有意义。
其次,您应该更改status列以保存整数以使索引更小。
第三,您应该创建一个id和status的索引,如下所示:
alter table user_info add index idxID_Status (id, status)
最后,要获得排名,您应该看看这个answer。此外,你应该添加一种方式来订购它们......获得没有订单的排名并不是真正的排名。
答案 1 :(得分:1)
正如我们从解释中看到的,MySQL在这里使用了错误的索引。首先,只需删除所有索引并创建一个新索引,至少包含以下两个字段:Id
和Honour
。它应该会大大提高性能。
ALTER TABLE user_info ADD INDEX myIndex (id, honour);
答案 2 :(得分:1)
我认为负载来自您的加入条件'&lt;'。
您可以尝试拆分查询或(或者如果您更喜欢子查询)并使用荣誉索引进行计数。
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;