根据这篇文章:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/ 使用ORDER BY RAND()是一个坏主意,因为:
问题是,MySQL必须对表中的每一行执行RAND()操作(这需要处理能力),然后才对其进行排序,并且只给你一行。
现在有些老大的工作,最近发现在使用MsSQL时我可以使用ORDER BY NEWID()(我不太了解)。现在,我的问题是,使用NEWID()和使用RAND()同样是一个坏主意 - 如果是这样,那么应该怎么做呢?
答案 0 :(得分:5)
以下是MySQL
RAND()
调用的代码:
double my_rnd(struct rand_struct *rand_st)
{
rand_st->seed1=(rand_st->seed1*3+rand_st->seed2) % rand_st->max_value;
rand_st->seed2=(rand_st->seed1+rand_st->seed2+33) % rand_st->max_value;
return (((double) rand_st->seed1)/rand_st->max_value_dbl);
}
您可以评估几个间接,添加和模数所需的处理能力。
ORDER BY RAND()
的真正问题是它需要对(可能很大的)random数组进行排序,而不是计算它们。
当然SQL Server
同样存在问题。
在MySQL
中,您可以避免对随机记录采样进行排序:
但是,此解决方案在SQL Server
中不起作用,因为它不支持会话变量。
答案 1 :(得分:0)
这是一篇关于如何为MSSQL和MySQL选择随机行,伪代码的优秀文章:Improving Order by rand and order by newid
答案 2 :(得分:0)