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
$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
$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)");
?>
Otimize o código abaixo:
<?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);
?>