2

このリンクによると、 ORDER BY RAND() は地獄のように非効率的です

それを念頭に置いて、私のId(主キー)が連続していない場合(AKA、私はできませんrand(1, max())か?

4

5 に答える 5

4

テーブルをランダムに並べ替える最良の方法は、フィールドを追加して任意のmd5ハッシュを入力し、そのフィールドにインデックスを作成することです。

これらのハッシュは、すべて異なる限り、好きなもののハッシュにすることができます。主キーIDフィールドと任意のソルト文字列をハッシュすることをお勧めします。

UPDATE myTable SET rand_hash = md5(concat(id,'anything here'))

これらを配置すると、テーブルの並べ替え順序がほぼ完全にランダムになります。別の任意のmd5ハッシュを作成し、その値に最も近いレコードをクエリすることにより、ランダムなポイントでテーブルをクエリできます。MD5ハッシュはランダムに分散されるため、すべてのレコードが同じように選択される可能性があります。このような何かがトリックを行います:

SELECT * FROM myTable WHERE rand_hash >= md5(now()) LIMIT 1

最良の点は、これがインデックスに対してクエリを実行することです。したがって、テーブルのどこにレコードがあるかに関係なく、非常に高速になります。

お役に立てば幸いです。

于 2012-09-03T21:10:11.800 に答える
0

mysql_data_seek(resource $result, int $row_number)代わりにphpで使用できます。

$result = mysql_query( 'SELECT * FROM `table`' );
mysql_data_seek( $result , mt_rand( 0 , mysql_num_rows( $result ) ) );

ただしmysql_data_seekmysql_num_rowsバッファリングされていないクエリでは機能しません。

于 2012-09-03T20:42:44.517 に答える
0

次のクエリを試しました。ORDER BY RAND () よりも高速です。

SELECT * FROM table WHERE (id >= RAND() * (SELECT MAX(id) FROM table) LIMIT 1;

列「id」がauto_incrementの場合、このクエリが以前よりもはるかに高速であることをテストしました:

SELECT * FROM table WHERE (id >= RAND() * (SELECT id FROM table ORDER BY id DESC LIMIT 1)) LIMIT 1;
于 2012-09-03T22:42:32.203 に答える
0

id ASC で ORDER BY してから、rand() 行または次に高い行を選択できます。

...
WHERE id >= rand(1, $max_id)
ORDER BY id ASC
LIMIT 1
于 2012-09-03T20:19:29.153 に答える
0

mysql_fetch_array() ランダムな回数を使用できます

$query=sprintf("SELECT * FROM acb");
$check=mysql_query($query);
for($i=1,$i<=rand($min_id,$max_id,$i++)
$row=mysql_fetch_array($check, MYSQL_ASSOC);

$row にはランダムな行が含まれるようになりました 注: この方法は私には非常に非効率的です

于 2012-09-03T20:29:03.520 に答える