Menú


Reducción de peticiones a la Base de datos

Este punto es tan obvio como escueto. Nuestra misión como analistas o programadores, debe de ser la de optimizar siempre el código y los processos. Las llamadas a la base de datos no son una excepción. Según el entorno en que trabajemos, quizás nos podemos permitir algunas libertades, pero cuando se trata de páginas Web, la velocidad es la prioridad. Entonces debemos tener en cuenta los siguientes puntos.

  • Reducir el número de conexiones por página. Si podemos encadenar todas las consultas, inserts y updates en una sola mejor.
  • No abrir conexiones si no son necesarias. Aquellas páginas que no necesiten de base de datos, evitar las conexiones. Esto que parece tan lógico sucede más de lo que parece. Es habitual incluir el archivo de conexión en todas las páginas como parte de una cabecera cómun. Evitad hacerlo.
  • En las consultas (SELECT), limitar si es posible el número de resultados y los campos a seleccionar. Es decir, si podemos evitar el uso del SELECT * mejor.
  • Limitar al máximo el número de registros a devolver. Por ejemplo:

    Supongamos que tenemos una tabla en la base de datos llamada poblaciones y que contiene todas las poblaciones de España. Los campos de esta tabla son: id, idComunidad, idProvincia, nombre. Y nos piden los cinco pueblos de Madrid. Tenemos varias formas de hacerlo. Os mostramos dos y cual sería más correcta.

    //1º Ejemplo en codigo PHP

    $sqlQuery = "SELECT nombre FROM poblaciones WHERE idComunidad = 3";      //Donde 3 es el id de la Comunidad de Madrid
    $result = mysqli_query($conn,$sqlQuery);      //Ejecutamos la consulta. $conn es la conexión
    $data = mysqli_fetch_array($result);      //Almacenamos los resultados en $data

    //Mostramos 5 pueblos de Cataluña
    for ($i=1;$i<=5;$i++)      //Iteración de 1 a 5
    {
         echo "Pueblo ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
    }

    //2º Ejemplo en codigo PHP

    $sqlQuery = "SELECT nombre FROM poblaciones WHERE idComunidad = 3 LIMIT 0,5";      //Donde 3 es el id de la Comunidad de Madrid
    $result = mysqli_query($conn,$sqlQuery);      //Ejecutamos la consulta. $conn es la conexión

    //Mostramos 5 pueblos de Catalunya
    for ($i=1;$i<=5;$i++)      //Iteración 5 veces
    {
         echo "Pueblo ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
    }

    En el primer caso el volumen de resultados obtenidos de la Base de datos, es mucho más elevado que en el segundo con la consiguiente diferencia de peso. Muchos pensarán que la diferencia es muy pequeña, pero cuando el número de consultas se dispara, entonces esta pequeá diferencia ya se convierte en un problema. No cuesta nada acostumbrarse siempre a trabajar ahorrando el máximo de recursos. Si lo hacemos así, aún cuando casi no importa la diferencia, nos servirá para ser mucho más rapidos y eficaces en casos más complejos.

  • Si tenemos que hacer varias consultas, intentar hacerlas juntas.

    Supongamos la misma tabla poblaciones de antes. Esta vez nos piden cinco pueblos de Madrid (id=3) y 5 pueblos de Andalucía (id=12).

    //1º Ejemplo en codigo PHP

    //Seleccionamos las poblaciones de Madrid
    $sqlQuery = "SELECT nombre FROM poblaciones WHERE idComunidad = 3 LIMIT 0,5";      //Donde 3 es el id de la Comunidad de Madrid
    $result = mysqli_query($conn,$sqlQuery);      //Ejecutamos la consulta. $conn es la conexión
    $data = mysqli_fetch_array($result);      //Almacenamos los resultados en $data

    //Mostramos 5 pueblos de Madrid
    for ($i=1;$i<=5;$i++)      //Iteración de 1 a 5
    {
         echo "Pueblo Madrid ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
    }
    //Seleccionamos las poblaciones de Andalucía
    $sqlQuery = "SELECT nombre FROM poblaciones WHERE idComunidad = 12 LIMIT 0,5";      //Donde 12 es el id de la Comunidad de Andalucía
    $result = mysqli_query($conn,$sqlQuery);      //Ejecutamos la consulta. $conn es la conexión
    $data = mysqli_fetch_array($result);      //Almacenamos los resultados en $data

    //Mostramos 5 pueblos de Andalucía
    for ($i=1;$i<=5;$i++)      //Iteración de 1 a 5
    {
         echo "Pueblo Andalucía ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
    }

    //2º Ejemplo en codigo PHP

    $sqlQuery = "SELECT nombre FROM poblaciones WHERE idComunidad = 3 LIMIT 0,5";      //Donde 3 es el id de la Comunidad de Madrid
    $sqlQuery .= " UNION ALL ";
    $sqlQuery .= "SELECT nombre FROM poblaciones WHERE idComunidad = 12 LIMIT 0,5";      //Donde 12 es el id de la Comunidad de Andalucía
    $result = mysqli_query($conn,$sqlQuery);      //Ejecutamos la consulta. $conn es la conexión

    //Mostramos 5 pueblos de Madrid y después 5 de Andalucía
    for ($i=1;$i<=10;$i++)      //Iteración de 1 a 5
    {
         if ($i<=5)
         {
              echo "Pueblo Madrid ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
         }else{
              echo "Pueblo Andalucía ".$i.": ".$data["nombre"]."<br />";      //Mostramos el pueblo
         }
    }

    En el primer caso el volumen de resultados obtenidos de la Base de datos, es mucho más elevado que en el segundo con la consiguiente diferencia de peso. Muchos pensarán que la diferencia es muy pequeña, pero cuando el número de consultas se dispara, entonces esta pequeá diferencia ya se convierte en un problema. No cuesta nada acostumbrarse siempre a trabajar ahorrando el máximo de recursos. Si lo hacemos así, aún cuando casi no importa la diferencia, nos servirá para ser mucho más rapidos y eficaces en casos más complejos.

En el primer caso, realizamos dos consultas a la base de datos, mientras que en segundo solo realizamos una. Obviamente la segunda opción es más eficiente que la primera. Estos son ejemplos básicos, pero algunas páginas contienen multiples accesos a la base de datos que con una buena estructuracion se pueden reducir mucho. Vale más sacrificar memoria, que no tiempo de respuesta.

Artículos relacionados