« FormValidator::Simpleにエラーメッセージ機能がついた。 | メイン | 「Class::DBI で疑似的カラム」をちょっと機能強化と、Class::DBIにStorable::freezeなデータ »

order by rand()

id:naoyaさんが書いている

インデックスをかけてるテーブルでも、結局ランダムなので全件捜査してから値を返す。プライマリーキーに対して rand() する場合でも O(1) ではないのですよね。なんか回避する方法があったりするのかな


order by rand()は最近知った方です。
通常ランダムで返す必要がある場合データベースではなくプログラム側で、2度SQLを発行してます。

my ($count) = $dbh->selectrow_array('select count(*) from table');
my $offset = int rand $count;
my $ret = $dbh->selectrow_hashref('select * from table limit ?,1',{},$offset);

これで対応してました。
やっていることは、id:jazzanovaさんと同じような感じ。
速いのかどうかはちょっとわかりません。