Optymalizacja wykorzystania zapytań SQL w PHP
Wykonywanie zapytań SQL do bazy danych jest bardzo powolną operacją. Dlatego należy starać się minimalizować liczbę zapytań do bazy.
Najczęstszym błędem jest wykonywanie wielu zapytań SQL w pętli, podczas gdy istnieją alternatywne zapytania, pozwalające wykonać pożądane działanie jednym poleceniem.
Spójrzmy na przykład.
Załóżmy, że mamy daną tablicę z id rekordów
w bazie danych i musimy usunąć rekordy
z takimi id.
Bez dłuższego myślenia, można napisać taką "wspaniałą" konstrukcję:
<?php
$ids = [1, 2, 3, 4, 5]; // tablica do usunięcia
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problem tego kodu polega na tym, że w pętli wykonywane jest
wiele zapytań. Wyobraź sobie, że
w tablicy będzie 100 elementów - wykonają się
100 zapytania do bazy!
Szczególna pułapka opisanego zadania polega na tym, że podczas tworzenia strony baza danych jest mała i zapytania wykonują się bardzo szybko. Jednakże, w miarę działania strony na hostingu baza będzie rosnąć, zapytania będą wykonywane coraz wolniej, i może dojść do tego, że z powodu wykonania setek zapytań w pętli strona będzie ładować się ponad minutę!
Wkładając niewiele wysiłku, można sprawić, że wykona się tylko jedno zapytanie, w ten sposób:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // otrzymamy ciąg '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Zoptymalizuj podany poniżej kod:
<?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);
?>