Optimering af brug af SQL-forespørgsler i PHP
Udførelse af SQL-forespørgsler til en database er en meget langsom operation. Derfor er det nødvendigt at stræbe efter at minimere antallet af forespørgsler til databasen.
Den mest almindelige fejl er at udføre mange SQL-forespørgsler i en løkke, når der findes alternative forespørgsler, der tillader at opnå det ønskede med en enkelt kommando.
Lad os se på et eksempel.
Antag at vi har en matrix med id'er for poster
i databasen, og vi er nødt til at slette poster
med disse id'er.
Uden at tænke længe, kan man skrive en sådan "fantastisk" konstruktion:
<?php
$ids = [1, 2, 3, 4, 5]; // matrix til sletning
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problemet med denne kode er, at der udføres
mange forespørgsler i løkken. Forestil dig, at
der er 100 elementer i matrixen - der vil blive udført
100 forespørgsler til databasen!
Den særlige faldgrub ved den beskrevne opgave er, at når hjemmesiden udvikles, er databasen lille og forespørgsler udføres meget hurtigt. Men efterhånden som hjemmesiden kører på webhostingen, vil databasen vokse, forespørgsler vil udføres langsommere og langsommere, og det kan komme dertil, at på grund af udførelsen af hundrede forespørgsler i en løkke, vil hjemmesiden tage over et minut om at loade!
Ved at anvende en lille smule ekstra effort, kan man gøre sådan, at der kun udføres en enkelt forespørgsel, sådan her:
<?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)");
?>
Optimér nedenstående 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);
?>