このブログを検索

2010年1月14日木曜日

データベースから0回を求めるには

やる夫たちの人狼村流石弟鯖のアイコン使用回数を調べるページを作成しました。
汝は人狼なりや? やる夫達の村 流石弟鯖専用アイコン使用回数検索
これは作成時のおおざっぱな記録です。


最初の方針

アイコンテーブルにあるもの:アイコンナンバー、アイコンファイル名、アイコン名
プレイヤーテーブルにあるもの:アイコンナンバー

使用回数を求めるにはプレイヤーテーブルにあるアイコンナンバーをgroup byすればいい。
ただしプレイヤーテーブルだけではアイコンファイル名とアイコン名がわからない。
またプレイヤーテーブルは村への参加記録なのでカウントの結果0が存在しない。

なのでアイコンテーブルとプレイヤーテーブルをアイコンナンバーをかすがいとして外部結合する。
アイコンテーブルを軸にするので未使用アイコンはNULLになるのでそこを0にする。

実際

アイコンテーブルとプレイヤーテーブルを外部結合しても未使用アイコンが表示されない。
プレイヤーテーブルのレコードが35000、アイコンテーブルのレコードが4400なので非常に処理が重い。

方針転換

まずアイコンテーブルからアイコンナンバー、アイコンファイル名、アイコン名をひっぱり、配列に突っ込む。
$array["number"]["number"]
$array["number"]["file"]
$array["number"]["name"]

次にプレイヤーテーブルからアイコンナンバーをgroup byしてcountをひっぱり、これを先に作った配列にやっぱり突っ込む。
$array["number"]["count"]
ちなみにあらかじめcountには0を入れておいて、プレイヤーテーブルにデータがないものにも対応。

後は表示用に整形するためにforeachを使って配列を回す。ここでifを使って上限下限の範囲内のみ表示する。

変えてみると

使用回数0回のもきっちり調べられる上データベースの処理に1分以上かかってたのが2,3秒で終わるものになった。


教訓

一回の複雑な命令でデータベースから完璧なデータを引っ張ってくるより、データベースは数回に分けても単純な命令ですませて、残りはPHPですませた方が楽で軽いこともある。

0 件のコメント:

コメントを投稿