Аптымізацыя выкарыстання SQL запытаў у PHP
Выкананне SQL запытаў да базы даных з'яўляецца вельмі павольнай аперацыяй. Таму трэба імкнуцца мінімізаваць колькасць запытаў да базы.
Самай распаўсюджанай памылкай з'яўляецца выкананне мноства SQL запытаў у цыкле, пры тым, што існуюць альтэрнатыўныя запыты, якія дазваляюць выканаць жаданае адной камандай.
Паглядзім на прыкладзе.
Хай у нас дадзены масіў з id запісаў
у базе даных і нам неабходна выдаліць запісы
з такімі id.
Не доўга думаючы, можна напісаць вось такую "цудоўную" канструкцыю:
<?php
$ids = [1, 2, 3, 4, 5]; // масіў для выдалення
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Праблема гэтага кода ў тым, што ў цыкле выконваецца
мноства запытаў. Уявіце сабе, што
ў масіве будзе 100 элементаў - выканаецца
100 запытаў да базы!
Асаблівая пастка апісанай задачы ў тым, што пры распрацоўцы сайта база даных маленькая і запыты выконваюцца вельмі хутка. Аднак, у меру работы сайта на хастынгу база будзе расці, запыты будуць выконвацца ўсё павольней, і можа дайсці да таго, што з-за выкананні сотні запытаў у цыкле сайт будзе грузіцца больш за хвіліну!
Прылажыўшы зусім няшмат намаганняў, можна зрабіць так, што будзе выконвацца ўсяго адзін запыт, вось так:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // атрымаем радок '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Аптымізуйце прыведзены ніжэй код:
<?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);
?>