約 30k レコードで満たされた db テーブルがあります。
一度に 1 つずつランダムにレコードを選択し (ユーザーが要求した場合)、テーブルからレコードを削除し、別のテーブルに挿入したいと考えています。
ORDER BY RAND()
実行が非常に遅くなる可能性があることを聞いた/発見しました。だから私はこのアルゴリズム(疑似コード)を使用しています:
lowest = getLowestId(); //get lowest primary key id from table
highest = getHighestId(); //get highest primary key id from table
do
{
id = rand(lowest, highest); //get random number between a range of lowest id and highest id
idExists = checkIfRandomIdExists( id );
}
while (! idExists);
row = getRow (id);
process(row);
delete(id);
現在、30,000 件のレコードがあり、ランダム ID を非常に迅速に取得しているようです。ただし、テーブルのサイズが 15k、10k、5k、100 などに減少するにつれて (数か月になる場合もあります)、これが遅くなり始めるのではないかと心配しています。
この方法をより効果的にするために何かできることはありますか、またはORDER BY RAND()
この方法の代わりに行数を開始する必要がある点はありますか? (たとえば、5k 行が残ったら、ORDER BY RAND() を開始しますか?)