私は約30kレコードでいっぱいのdbテーブルを持っています。データベースからランダムレコードを選択するこの方法の欠陥?
一度に1つずつレコードをランダムに選択し(ユーザーが要求した場合)、そのレコードをテーブルから削除し、別のテーブルに挿入したいとします。
私は、ORDER BY RAND()
の処理が非常に遅いと聞いたことがあります。だから私はこのアルゴリズム(擬似コード)を使用しています:30Kレコードを、今
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);
を、私は非常に迅速にランダムIDを取得するように見えます。しかし、テーブルのサイズが15k、10k、5k、100などに減少すると(数ヶ月になる可能性があります)、これが遅くなることが懸念されます。
この方法をより効果的にするために何かを行うことができますか、またはこの方法の代わりにORDER BY RAND()
を実行する必要がある行のカウントがありますか? (例えば、5k行が残っている場合はORDER BY RAND()を実行しますか?)
乱数を扱うときは、通常反復しないのが最善です。代わりに、すべての可能なIDでいっぱいの配列を取得し、ランダムに選択してみてください。 –
[Linq Orderby random]の可能な複製(http://stackoverflow.com/questions/3339192/linq-orderby-random) –