SQL Sorgularının PHP'de Optimize Edilmesi

Veritabanına SQL sorguları yapmak çok yavaş bir işlemdir. Bu nedenle veritabanına yapılan sorgu sayısını en aza indirmeye çalışmak gerekir.

En yaygın hata, bir döngü içinde çok sayıda SQL sorgusu yapmaktır, halbuki istenileni tek bir komutla yapmaya olanak tanıyan alternatif sorgular mevcuttur.

Bir örnek üzerinden inceleyelim.

Bize veritabanında kayıtlara ait id'lerden oluşan bir dizi verilsin ve bu id'ye sahip kayıtları silmemiz gereksin.

Fazla düşünmeden, şu "harika" yapıyı yazabiliriz:

php<?php
  $ids = [1, 2, 3, 4, 5]; // silinecek dizi
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

Bu kodun sorunu, döngü içinde çok sayıda sorgu yapılmasıdır. Dizide 100 eleman olacağını düşünün - veritabanına 100 sorgu yapılacak!

Açıklanan görevin özel tuzağı şudur: site geliştirilirken veritabanı küçüktür ve sorgular çok hızlı çalışır. Ancak, site hosting üzerinde çalıştıkça veritabanı büyüyecek, sorgular giderek daha yavaş çalışacak ve bir döngüde yüzlerce sorgu yapıldığı için site bir dakikadan fazla yüklenebilir!

Çok az çaba harcayarak, sadece bir sorgunun yapılmasını şu şekilde sağlayabiliriz:

php<?php
  $ids = [1, 2, 3, 4, 5];
  
  $str = implode(',', $ids); // '1,2,3,4,5' dizgesini alır
  mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Задание 1

Aşağıdaki kodu optimize edin:

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