如何优化查询(排名查询)?

时间:2011-03-19 09:01:22

标签: mysql subquery rank

过去两天,我一直在询问有关Mysql中排名查询的问题。到目前为止,我有

的查询
  1. 查询表中的所有行,并按其排名进行排序。
  2. 仅查询一行及其等级
  3. 以下是我昨晚提问的链接

    How to get a row rank?

    你可能会注意到,btilly的查询非常快。

    这是一个查询,只根据btilly的查询获得我的排名的一行。

    set @points = -1; 
    set @num = 0;
    
    select * from (
    
    SELECT id
      , points
      , @num := if(@points = points, @num, @num + 1) as point_rank
      , @points := points as dummy
    FROM points
    ORDER BY points desc, id asc
    
    ) as test where test.id = 3
    

    上面的查询是使用子查询..所以我担心性能。

    我还可以使用其他更快的查询吗?

    表格点

    id      points
    1   50
    2   50
    3   40
    4   30
    5   30
    6   20
    

1 个答案:

答案 0 :(得分:1)

不要对子查询感到恐慌。子查询总是慢 - 仅在某些情况下。您的查询存在的问题是它需要完整扫描

这是一个应该更快的替代方案:

SELECT COUNT(DISTINCT points) + 1
FROM points
WHERE points > (SELECT points FROM points WHERE id = 3)

id上添加一个索引(我猜你可能想要一个主键)和points上的另一个索引,以使这个查询有效地执行。