SQL-kyselyjen käytön optimointi PHP:ssä
SQL-kyselyjen suorittaminen tietokantaan on erittäin hidas toimenpide. Siksi on pyrittävä minimoimaan kyselyjen määrää tietokantaan.
Yleisin virhe on useiden SQL-kyselyjen suorittaminen silmukassa, vaikka on olemassa vaihtoehtoisia kyselyjä, jotka mahdollistavat halutun toimenpiteen yhdellä komennolla.
Katsotaan esimerkkiä.
Oletetaan, että meillä on taulukko, joka sisältää
tietokannan tietueiden idt
ja meidän on poistettava tietueet, joilla on nämä
idt.
Välittömästi voidaan kirjoittaa tällainen "mainio" rakenne:
<?php
$ids = [1, 2, 3, 4, 5]; // taulukko poistettavia varten
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Tämän koodin ongelma on, että silmukassa suoritetaan
useita kyselyjä. Kuvittele, että
taulukossa on 100 elementtiä - suoritetaan
100 kyselyä tietokantaan!
Kuvatun tehtävän erityis ansa on, että sivustoa kehitettäessä tietokanta on pieni ja kyselyt suoritetaan erittäin nopeasti. Kuitenkin, sivuston toiminnan myötä hosting-ympäristössä tietokanta kasvaa, kyselyt suoritetaan yhä hitaammin, ja voi päästä tilanteeseen, jossa satojen kyselyjen suorittaminen silmukassa johtaa siihen, että sivusto latautuu yli minuutin!
Käyttämällä vain vähän vaivaa, voidaan tehdä niin, että suoritetaan vain yksi kysely, näin:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // saadaan merkkijono '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimoi alla oleva koodi:
<?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);
?>