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
$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
$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)");
?>
Aşağıdaki kodu optimize edin:
<?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);
?>