Optimalisatie van het gebruik van SQL queries in PHP
Het uitvoeren van SQL queries naar een database is een erg trage operatie. Daarom is het nodig te proberen het aantal queries naar de database te minimaliseren.
De meest voorkomende fout is het uitvoeren van een groot aantal SQL queries in een lus, terwijl er alternatieve queries bestaan die het gewenste in één opdracht mogelijk maken.
Laten we naar een voorbeeld kijken.
Stel dat we een array krijgen met id van records
in de database en we moeten records
met dergelijke id verwijderen.
Zonder lang na te denken, kan men zo'n "prachtige" constructie schrijven:
<?php
$ids = [1, 2, 3, 4, 5]; // array voor verwijdering
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Het probleem met deze code is dat in de lus
een groot aantal queries wordt uitgevoerd. Stel je voor
dat er 100 elementen in de array zitten - er worden
100 queries naar de database uitgevoerd!
De speciale valkuil van de beschreven taak is dat tijdens de ontwikkeling van de site de database klein is en queries erg snel worden uitgevoerd. Echter, naarmate de site op de hosting draait, zal de database groeien, queries zullen steeds langzamer worden uitgevoerd, en het kan zover komen dat door het uitvoeren van honderd queries in een lus de site er meer dan een minuut over doet om te laden!
Met heel weinig inspanning kan men ervoor zorgen dat er slechts één query wordt uitgevoerd, zoals hier:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // we krijgen de string '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimaliseer de onderstaande code:
<?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);
?>