SQL高速化
SQLですが、ちょっとした心がけでパフォーマンスが変わってきます。
SQLの実行回数はなるべく減らしましょう。
以下は問題のあるcodeです。
×ループの中で実行するとパフォーマンスが低下する
foreach ($rows as $row) { // ループの中で回数分実行される mysql_query("SELECT * FROM posts WHERE id ={$row['id']}"); }
1つのクエリの時間が短くてもループの中で繰り返し実行すると、その回数分時間がかかります。
例えば1つのクエリが10msecでも100回ループすれば1秒、1000回ループすれば10秒かかります。
また、SQLを実行するには、構文解析→最適化(オプティマイザーがインデックスを決める)→実行と複雑な処理が実行されるので、1回実行するのと100回実行するのとではオーバーヘッドの時間の差がでてきます。
ループの中で実行するのではなく、INやORを使って一度で取得しましょう。
○INを使って一度だけ実行する
foreach ($rows as $row) { $idList[] = $row['id']; } // 配列に格納しているidを","区切りで展開する $ids = implode(",", $idList); // ループの外に出して一度だけ実行 mysql_query("SELECT * FROM posts WHERE id IN({$ids})");