Optimalisering van SQL-navraegebruik in PHP
Die uitvoering van SQL-navrae na 'n databasis is 'n baie stadige operasie. Daarom is dit nodig om die aantal navrae na die databasis te minimeer.
Die mees algemene fout is die uitvoering van baie SQL-navrae in 'n lus, terwyl daar alternatiewe navrae bestaan wat dit moontlik maak om die verlangde met een opdrag uit te voer.
Kom ons kyk na 'n voorbeeld.
Gestel ons het 'n skikking met id-ers van rekords
in die databasis en ons moet rekords
met sulke id verwyder.
Sonder veel dink, kan 'n mens so 'n "wonderlike" konstruksie skryf:
<?php
$ids = [1, 2, 3, 4, 5]; // skikking om te verwyder
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Die probleem met hierdie kode is dat baie navrae
in die lus uitgevoer word. Stel jou voor dat
daar 100 elemente in die skikking is - daar sal
100 navrae na die databasis uitgevoer word!
Die spesifieke valstrik van die beskryfde taak is dat met die ontwikkeling van 'n webwerf die databasis klein is en navrae baie vinnig uitgevoer word. Maar, soos die webwerf op die hostingbediener werk, sal die databasis groei, navrae sal al hoe stadiger uitgevoer word, en dit kan tot so 'n punt kom dat as gevolg van die uitvoering van honderd navrae in 'n lus, die webwerf meer as 'n minuut sal neem om te laai!
Met net 'n bietjie moeite, kan 'n mens dit so maak dat slegs een navraag uitgevoer word, soos hier:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // kry die string '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimaliseer die onderstaande kode:
<?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);
?>