読者です 読者をやめる 読者になる 読者になる

とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

preload (プリロード)のお話

今日仕事してていいものを見つけたから記述。

たとえば○×学校と△△学校というマスタに
生徒がぶら下がっていて以下のようになっている場合。

・学校マスタ(data_school)

id name
1 ○×学校
2 △△学校
・生徒テーブル(chaild)
id school_id name
1 2 山田太郎
2 1 山田花子
3 2 山田ジェイソン
こんな感じ。 まぁJOINしろよ。とかあるだろうけど、 結構大きいシステムだとJOINがボトルネックになったりしますよね。 だからと言って、生徒を取得して、学校に紐付けするときに学校マスタをいちいち参照するのは結構大変だし、これもボトルネックになる可能性がある。 って時に、使うと確かに使えるとおもった。 考え方敵にはとりあえず学校マスタを一旦全部取得しておいてキャッシュしておく。 んでひも付けはプログラム側でやってしまう。というもの。 1.まずは学校マスタをあらかじめ全部取得しておく。 2.生徒を必要数取得したら学校IDは既に紐付けで持ってますよね。 3.ってことで以下のように取れるはず。

//初期化しておく
$preload = array();

$shools = /*適当に学校マスタを全部取得*/;
foreach($shools as $school){
    $preload[$school->id] = $school;
}

//生徒を参照。
$chailds = /*生徒が全部とる*/;

foreach($chailds as $chaild){
    $chailds->school = $preload[$chaild->school_id];
}

これだけ見るとなんか逆に重たくなるわ。
って思うけど大きいテーブルを扱うときには負荷軽減になるときもあると思われます。