Simple, Slowly

ブログを引っ越ししました。http://48.jp

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})");