SQL vaicājumu izmantošanas optimizēšana PHP
SQL vaicājumu izpilde datu bāzē ir ļoti lēna darbība. Tāpēc ir jācenšas minimāli samazināt vaicājumu skaitu uz datu bāzi.
Biežākā kļūda ir vairāku SQL vaicājumu izpilde cilpā, turpretī, ka pastāv alternatīvi vaicājumi, kas ļauj vēlamo izpildīt ar vienu komandu.
Apskatīsim uz piemēra.
Pieņemsim, ka mums ir dots masīvs ar
id ierakstiem
datu bāzē un mums ir jāizdzēš ieraksti
ar tādiem id.
Neiedziļinoties, var uzrakstīt šādu "brīnišķīgu" konstrukciju:
<?php
$ids = [1, 2, 3, 4, 5]; // masīvs dzēšanai
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Šī koda problēma ir tā, ka cilpā tiek izpildīts
daudz vaicājumu. Iedomājieties, ka
masīvā būs 100 elementu - izpildīsies
100 vaicājumi uz datu bāzi!
Īpaša šī uzdevuma slazds ir tāds, ka attīstot vietni, datu bāze ir maza un vaicājumi tiek izpildīti ļoti ātri. Tomēr, pēc vietnes darbības uz hostinga, datu bāze augs, vaicājumi tiks izpildīti arvien lēnāk, un var nonākt līdz tādam, ka veicot simts vaicājumus cilpā, vietne ielādēsies vairāk nekā minūti!
Pieliekot mazliet pūļu, var izdarīt tā, ka tiks izpildīts tikai viens vaicājums, šeit:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // iegūstam virkni '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimizējiet zemāk redzamo kodu:
<?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);
?>