0

非常に大きなテーブルから N 個のランダムな項目を選択する最善の方法について、mySQL タグに多くの質問がありますほとんどの場合、答えは に要約されORDER BY RAND() LIMIT Nますが、行ごとに乱数を生成し、このインデックスのないフィールドに基づいて結果セットを再ソートする必要があるため、これは非常に非効率的であると思います。

私の考えは、次のようなことをすることです:[PHP風の疑似コードで書かれていますが、どの言語にも翻訳する必要があります]

$rowcount = query("
    SELECT COUNT(*) FROM mytable WHERE [condition];
");
$rand_index = rand(0, $rowcount); // random int between 0 and $rowcount
$rand_row = query("
    SELECT field1, field2, ...
    FROM mytable WHERE [condition]
    LIMIT $rand_index, 1
");
// repeat last 2 lines as needed to get N rows.

ORDER BY RAND() LIMIT Nこれらのクエリは、使用されるテーブルで定義されたインデックスを使用するため、よりもはるかに高速であるべきではありませんか?

4

0 に答える 0