Optimización del uso de consultas SQL en PHP
Ejecutar consultas SQL en una base de datos es una operación muy lenta. Por lo tanto, debemos intentar minimizar la cantidad de consultas a la base de datos.
El error más común es ejecutar múltiples consultas SQL en un bucle, cuando existen consultas alternativas que permiten lograr el objetivo con un solo comando.
Veamos un ejemplo.
Supongamos que tenemos un array con id de registros
en la base de datos y necesitamos eliminar los registros
con esos id.
Sin pensarlo mucho, se podría escribir la siguiente "maravillosa" construcción:
<?php
$ids = [1, 2, 3, 4, 5]; // array para eliminar
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
El problema de este código es que se ejecutan
múltiples consultas en el bucle. Imagine que
el array tenga 100 elementos - ¡se ejecutarán
100 consultas a la base de datos!
La trampa particular de la tarea descrita es que durante el desarrollo del sitio la base de datos es pequeña y las consultas se ejecutan muy rápido. Sin embargo, a medida que el sitio funciona en el hosting, la base de datos crecerá, las consultas se ejecutarán cada vez más lentamente, ¡y puede llegar al punto en que, debido a la ejecución de cientos de consultas en un bucle, el sitio tarde más de un minuto en cargar!
Con muy poco esfuerzo, podemos hacer que se ejecute solo una consulta, de la siguiente manera:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // obtenemos la cadena '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimice el siguiente código:
<?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);
?>