PHPにおけるSQLクエリの使用最適化

データベースへのSQLクエリの実行は 非常に遅い操作です。したがって、 データベースへのクエリ回数を最小限に抑えるよう 努める必要があります。

最も一般的な間違いは、 ループ内で多数のSQLクエリを実行することです。 一方で、望む動作を1つのコマンドで実行できる 代替クエリが存在する場合があります。

例を見てみましょう。

データベース内のレコードのidを持つ配列が与えられ、 そのようなidのレコードを削除する必要があるとします。

あまり考えずに、以下のような 「素晴らしい」構造を書いてしまうかもしれません:

php<?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<?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)");
?>
Задание 1

以下のコードを最適化してください:

php<?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);
?>