MYSQL SELECT在大型表ORDER BY SCORE上随机

时间:2014-08-18 10:28:14

标签: mysql select

我有一个大约25000行的大型mysql表。共有5个表格字段:ID,NAME,SCORE,AGE,SEX

我需要选择随机5 MALES命令BY SCORE DESC

例如,如果有100名男性每人获得60分,另外100人每人得分45分,那么该剧本应该从25000名单中的前200名男性中随机返回5

  

ORDER BY RAND()

     

很慢

真正的问题是,在前200条记录中,5名男性应该是随机选择。谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

我不认为随机排序可以"优化"以任何方式排序是N * log(N)操作。查询分析器通过使用索引来避免排序。

ORDER BY RAND()操作实际上会重新查询表的每一行,分配一个随机数ID,然后传递结果。对于超过500行的表,这需要大量的处理时间。而且由于你的桌子包含大约25000行,所以肯定会花费很多时间。

答案 1 :(得分:2)

所以为了获得这样的东西,我会使用一个子查询..这样你只是将RAND()放在外部查询上,这将不那么费力。

根据我从你的问题中的理解,你希望表中得分最高的200名男性......所以这将是这样的:

SELECT * 
FROM table_name
WHERE age = 'male'
ORDER BY score DESC
LIMIT 200

现在将5个结果随机化,就像这样。

SELECT id, score, name, age, sex
FROM
(   SELECT * 
    FROM table_name
    WHERE age = 'male'
    ORDER BY score DESC
    LIMIT 200
) t -- could also be written `AS t` or anything else you would call it
ORDER BY RAND()
LIMIT 5