SQL հարցումների օպտիմիզացում PHP-ում

SQL հարցումների կատարումը տվյալների բազայի նկատմամբ շատ դանդաղ գործողություն է: Ուստի անհրաժեշտ է ձգտել նվազագույնի հասցնել բազայի հարցումների քանակը:

Ամենատարածված սխալը բազմաթիվ SQL հարցումների կատարումն է ցիկլում, այն դեպքում, երբ գոյություն ունեն այլընտրանքային հարցումներ, որոնք թույլ են տալիս կատարել ցանկացածը մեկ հրամանով:

Տեսնենք օրինակով:

Ենթադրենք, մեզ տրված է զանգված id գրառումներով տվյալների բազայում և մեզ անհրաժեշտ է ջնջել գրառումները այդ id-ներով:

Շատ չմտածելով, կարելի է գրել այսպիսի "հրաշալի" կոնստրուկցիա:

php<?php
  $ids = [1, 2, 3, 4, 5]; // զանգված ջնջելու համար
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

Այս կոդի խնդիրն այն է, որ ցիկլում կատարվում է բազմաթիվ հարցումներ: Պատկերացրեք, որ զանգվածում կա 100 տարր - կկատարվի 100 հարցում դեպի բազա:

Նկարագրված առաջադրանքի հատուկ թակարդն այն է, որ կայքը մշակելիս տվյալների բազան փոքր է և հարցումները կատարվում են շատ արագ: Սակայն, քանի որ կայքը աշխատում է հոստինգում, բազան կլինի աճում, հարցումները կկատարվեն ավելի ու ավելի դանդաղ, և կարող է հասնել նրան, որ հարյուրավոր հարցումների կատարման պատճառով ցիկլում կայքը կբեռնվի ավելի քան մեկ րոպե:

Կիրառելով совсем немного усилий, можно сделать так, что будет выполнятся всего один запрос, вот так:

php<?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)");
?>
Задание 1

Օպտիմիզացրեք ստորև բերված կոդը:

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