4

この記事によると:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/ ORDER BY RAND()を使用することは、次の理由で悪い考えです。

問題は、MySQLは、テーブルをソートして1行だけを与える前に、テーブル内のすべての行に対してRAND()操作(処理能力を必要とする)を実行する必要があることです。

最近、仕事の関係者が、MsSQL(私はあまり知りません)を使用するときにORDER BY NEWID()を使用できることを発見しました。さて、私の質問は、RAND()を使用するのと同じくらいNEWID()を使用するのは悪い考えですか?もしそうなら、それはどのように行われるべきですか?

4

2 に答える 2

5

によって呼び出されるコードは次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セッション変数をサポートしていないため、機能しません。

于 2011-03-31T14:45:21.247 に答える
0

これは、ランダムな行を選択する方法に関する優れた記事であり、MSSQL と MySQL の両方の疑似コードです: Improving Order by rand と order by newid

于 2011-09-05T23:42:50.977 に答える