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

时间:2012-04-13 16:58:25

标签: php mysql

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'

3 个答案:

答案 0 :(得分:1)

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

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

第三,您应该创建一个id和status的索引,如下所示:

alter table user_info add index idxID_Status (id, status)

最后,要获得排名,您应该看看这个answer。此外,你应该添加一种方式来订购它们......获得没有订单的排名并不是真正的排名。

答案 1 :(得分:1)

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

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;