mysql - MsSQL NEWID 是否像 MySQL Rand() 一样糟糕

标签 mysql sql-server random newid

根据这篇文章: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() 一样都是一个坏主意 - 如果是,那么应该如何完成?

最佳答案

这是 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,因为它不支持 session 变量。

关于mysql - MsSQL NEWID 是否像 MySQL Rand() 一样糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5501489/

相关文章:

mysql - 在 SQL 中执行 contains select 语句

mysql - SQL查询以选择具有完全相似的列?

php - 将基本的 PHP/MySql 转换为 ASP 以查询 MS Sql 数据库

r - 通过 ID 和 R 中的某个因子分布创建一个随机子样本

java - 无法从 ListArray 中获取随机元素

php - 如果日期范围包含列表 PHP 中的日期,则减去天数

sql - 如何使用非默认端口创建链接服务器

sql-server - 为什么我的 SQL Server 删除查询计划中的排序有问题?

algorithm - 带权重的 Karger 算法

MySQL 如何对 Joined 和 Group_Concat 列进行排序?