phpからデータをランダムに取り出す場合、
rand() 関数を使うと、非常に重くなってしまいます。
そこで、軽くてスマートな方法が無いか悩んでいます。
複数のカラムが必要で、ランダムデータは10個として考えています。
Mysqlからランダムにデータを取得する方法で、
良い方法がありましたらアドバイスお願いします。
mysqlでの負荷を避けるのであればPHP側でランダム取得をさせれば良いのでは?
array_rand
http://php.plus-server.net/function.array-rand.html
また、ランダムに表示させるのをアクセス毎にしないのであれば、
静的にincludeするファイルを書き出してしまえば良いと思います。
「phpからデータをランダムに取り出す場合」というのは「MySQLからデータをランダムに取り出す場合」の誤記だと思いますが、それにしても、ランダムデータが10個しかないのに「rand() 関数を使うと、非常に重くなってしまいます」というのが引っかかります。
スクリプトに問題があるのではないでしょうか?
MySQLにも RAND関数 があるので、これを使って
SELECT * FROM テーブル ORDER BY RAND();
のような SQL 文を書くことはできますが、rand 関数より速いという保証はありません。
どうもありがとうございます。
mysqlのrand()を使っていたことがあって、
データ量が多くなると非常に重くて、サーバー会社から突如DBを全消去された
痛い思い出があって・・・。
そこで、DBからランダムで取り出すケースでは、
rand()をmysqlで使わずにできる良い方法はないかな、と模索してました。
#2で回答した者です。
PHPのrand関数で時間がかかると勘違いしていました。ごめんなさい。
「MySQLのrand関数を使いたくない」というご要望であれば、LIMIT句を使ってみてはどうでしょう。以下、PHPスクリプトのイメージです。
$cnt = 10; //レコード数 srand(); $n = (int)rand(1, $cnt); $sql = "SELECT * FROM テーブル LIMIT {$n}, 1;"; ~SQL文の実行
どうもありがとうございます。
limitを使って、特定のレコードを1件取得、というのを繰り返せば、ランダム取得できそうですね。
データ全件取得後、phpでランダムにピックアップよりかなり軽そうですねぇ。
array_randで10個ナンバーをピックアップして、そのナンバーのデータをselect×10回、ですね。
それか、データを全部selectした後、array_randでそこから10個選ぶ・・・。
こっちは重そうですね。。