我有一个大约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名男性应该是随机选择。谢谢你的帮助
答案 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