MySQLで「ORDER BY RAND() LIMIT 8」として、8枚を取得していたのだけれど、母数が13000枚ぐらいになって、ORDER BY RAND()では厳しい様子。1.8秒ぐらいかかかる。
で、方式を変えてみた。
ひとつ考えたのは、データベースに乱数フィールドを作って、それをcronで更新し、それをソートするみたいなやり方。
UPDATE table SET field = RAND()*10000;で、乱数は更新。
なんとなく、乱数でのソートが少しネックになる感じ(0.7秒ぐらい)だったのでこれはやめた。
で、こうした。
1) 対象データベース数を取得
2) PHPでその範囲内(マイナス8)のスタート数字を決める。
3) そこからフィールドを100個取得して配列へ。
4) PHPで配列をシャッフルして、最初の8つを表示。
8枚は並びの100個(300個にしてもたいして変わらない)という範囲内からのランダムになるけれども、まあ良いかな。
それより、昨日の夜はサーバーが非常に重かった。急激にアクセスが増えた様子もなく原因はよく分からないのだけれど、やっぱりMySQL絡みのように思えたので、phpMyAdminでMySQLのランタイム情報というのを見ながら、my.cnfを少しチューニング。
tmp_table_size
というのを追加してみたり。
根本的にクエリを減らす方向で作り直さなきゃだめなのかもしれないな。直ぐに何万クエリが発生するというのは過多な気がする。
