PHPにおけるSQLクエリの使用最適化
データベースへのSQLクエリの実行は 非常に遅い操作です。したがって、 データベースへのクエリ回数を最小限に抑えるよう 努める必要があります。
最も一般的な間違いは、 ループ内で多数のSQLクエリを実行することです。 一方で、望む動作を1つのコマンドで実行できる 代替クエリが存在する場合があります。
例を見てみましょう。
データベース内のレコードのidを持つ配列が与えられ、
そのようなidのレコードを削除する必要があるとします。
あまり考えずに、以下のような 「素晴らしい」構造を書いてしまうかもしれません:
<?php
$ids = [1, 2, 3, 4, 5]; // 削除対象の配列
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
このコードの問題点は、ループ内で多数のクエリが
実行されることです。配列に100個の要素が
含まれていると想像してみてください -
データベースに対して100回のクエリが実行されます!
このタスクの特別な落とし穴は、 サイト開発中はデータベースが小さく、 クエリが非常に速く実行されることです。 しかし、ホスティング環境でのサイト運営が進むにつれて データベースは大きくなり、 クエリの実行は次第に遅くなり、 ループ内で数百回のクエリを実行することで、 サイトの読み込みに1分以上かかる事態に なる可能性があります!
ほんの少し努力を加えることで、 わずか1つのクエリのみを実行するように することができます。以下のように:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // 文字列 '1,2,3,4,5' を取得
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
以下のコードを最適化してください:
<?php
$arr = [1, 2, 2, 4, 5];
$res = [];
for ($i = 1; $i < count($arr); $i++) {
$note = mysqli_query($link, "SELECT * FROM users WHERE id=$id");
for ($data = []; $row = mysqli_fetch_assoc($note); $data[] = $row);
$res[] = $data;
}
var_dump($res);
?>