Otimização do Uso de Consultas SQL em PHP

A execução de consultas SQL para um banco de dados é uma operação muito lenta. Portanto, é necessário tentar minimizar a quantidade de consultas ao banco.

O erro mais comum é a execução de múltiplas consultas SQL em um loop, quando existem consultas alternativas que permitem realizar o desejado com um único comando.

Vamos ver um exemplo.

Suponha que tenhamos um array com os id de registros no banco de dados e precisemos excluir os registros com esses id.

Sem pensar muito, pode-se escrever uma construção "maravilhosa" como esta:

php<?php
  $ids = [1, 2, 3, 4, 5]; // array para exclusão
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

O problema deste código é que múltiplas consultas são executadas no loop. Imagine que o array tenha 100 elementos - serão executadas 100 consultas ao banco!

A armadilha particular da tarefa descrita é que, durante o desenvolvimento do site, o banco de dados é pequeno e as consultas são executadas muito rapidamente. No entanto, com o funcionamento do site no hospedagem, o banco de dados crescerá, as consultas ficarão cada vez mais lentas, e pode chegar a um ponto em que, devido à execução de centenas de consultas em um loop, o site levará mais de um minuto para carregar!

Com um pequeno esforço, podemos fazer com que apenas uma consulta seja executada, assim:

php<?php
  $ids = [1, 2, 3, 4, 5];
  
  $str = implode(',', $ids); // obtém a string '1,2,3,4,5'
  mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Задание 1

Otimize o código abaixo:

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