【问题标题】:Is MsSQL NEWID bad like MySQL Rand()MsSQL NEWID 是否像 MySQL Rand() 一样糟糕
【发布时间】:2011-03-31 14:30:59
【问题描述】:

根据这篇文章:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/ 使用 ORDER BY RAND() 是个坏主意,因为:

问题是,MySQL 必须对表中的每一行执行 RAND() 操作(这需要处理能力),然后才能对其进行排序并只给你 1 行。

现在一些工作的家伙,最近发现你可以在使用 MsSQL 时使用 ORDER BY NEWID() (我不太了解)。现在,我的问题是,使用 NEWID() 和使用 RAND() 一样糟糕吗?如果是,那么应该如何做?

【问题讨论】:

标签: mysql sql-server random newid


【解决方案1】:

这是MySQLRAND()调用的代码:

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() 的真正问题是它需要对随机数(可能很大)数组进行排序,而不是计算它们。

SQL Server 当然也存在同样的问题。

MySQL中,可以避免对随机记录进行排序:

但是,此解决方案不适用于 SQL Server,因为它不支持会话变量。

【讨论】:

    【解决方案2】:

    这是一篇关于如何选择随机行的优秀文章,MSSQL 和 MySQL 的伪代码:Improving Order by rand and order by newid

    【讨论】: