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);
?>