优化和提高此 MYSQL 查询的性能


Optimise & improve performance of this MYSQL query

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'

我认为负载来自您的连接条件"<"。

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

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;

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

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

第三,你应该创建一个关于 id 和状态的索引,如下所示:

alter table user_info add index idxID_Status (id, status)

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

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

ALTER TABLE user_info ADD INDEX myIndex (id, honour);