Optimering av användning av SQL-förfrågningar i PHP
Att köra SQL-förfrågningar mot en databas är en mycket långsam operation. Därför är det nödvändigt att försöka minimera antalet förfrågningar till databasen.
Det vanligaste misstaget är att köra många SQL-förfrågningar i en loop, trots att det finns alternativa förfrågningar som gör det möjligt att utföra önskat med ett enda kommando.
Låt oss titta på ett exempel.
Antag att vi har en array med id för poster
i databasen och vi behöver ta bort poster
med sådana id.
Utan att tänka för länge kan man skriva en sådan "underbar" konstruktion:
<?php
$ids = [1, 2, 3, 4, 5]; // array för borttagning
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problemet med den här koden är att den utför
många förfrågningar i loopen. Föreställ dig att
det finns 100 element i arrayen -
100 förfrågningar kommer att köras mot databasen!
Den speciella fällan med den beskrivna uppgiften är att när webbplatsen utvecklas är databasen liten och förfrågningarna körs mycket snabbt. Men allteftersom webbplatsen på webbhotellet växer kommer databasen att växa, förfrågningarna kommer att bli långsammare, och det kan komma till den punkt där, på grund av att hundratals förfrågningar körs i en loop, kommer webbplatsen att laddas i mer än en minut!
Med väldigt lite ansträngning kan man göra så att endast en förfrågan körs, så här:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // får strängen '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimera koden nedan:
<?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);
?>