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