Optimalisering av bruk av SQL-spørringer i PHP
Utførelse av SQL-spørringer mot en database er en veldig treg operasjon. Derfor bør man prøve å minimere antall spørringer til databasen.
Den vanligste feilen er å utføre mange SQL-spørringer i en loop, når det finnes alternative spørringer som tillater ønsket handling med én kommando.
La oss se på et eksempel.
Anta at vi har en array med id-er for poster
i databasen, og vi må slette poster
med disse id-ene.
Uten å tenke lenge, kan man skrive en "fantastisk" konstruksjon som denne:
<?php
$ids = [1, 2, 3, 4, 5]; // array for sletting
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problemet med denne koden er at den utfører
mange spørringer i løkken. Tenk deg at
arrayen inneholder 100 elementer - da vil
100 spørringer mot databasen bli utført!
Den spesielle fellen med den beskrevne oppgaven er at når nettsiden utvikles, er databasen liten og spørringene utføres veldig raskt. Men ettersom nettsiden på hostingtjeneren vokser, vil databasen øke i størrelse, spørringene vil utføres saktere og saktere, og det kan komme til et punkt hvor, på grunn av hundrevis av spørringer i en loop, vil nettsiden laste i over ett minutt!
Ved å legge inn litt innsats, kan man gjøre slik at bare én enkelt spørring utføres, slik som dette:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // får strengen '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimaliser koden nedenfor:
<?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);
?>