根据这篇文章:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/
使用ORDER BY RAND()是一个坏主意,因为:
The problem is, MySQL will have to perform RAND() operation (which takes processing power) for every single row in the table before sorting it and giving you just 1 row.
现在一些工作的家伙,最近发现你可以在使用MsSQL时使用ORDER BY NEWID()(我不太了解).现在,我的问题是,使用NEWID()和使用RAND()同样是一个坏主意 – 如果是这样,那么应该怎么做呢?
解决方法:
这是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中不起作用,因为它不支持会话变量.