Optimizar nuestras consultas a base de datos MySQL

Optimizar MySQL es una tarea que debemos tener en mente desde el minuto cero al empezar a programar. Por lo tanto es tarea de los programadores estructurar apropiadamente, escribir peticiones apropiadas, y programar mejor código. A continuación mostramos algunas técnicas de optimización MySQL.

  • En una consulta SELECT, hay que evitar en lo posible el uso del comodín “*”, e indicar sólo los campos que se necesitan. Eso reducirá el tamaño de la consulta. Considerar que cada campo extra genera tiempo extra.

Ejemplo:

      mysql> SELECT campo1, campo2 FROM table;
  • Usa frecuentemente el LIMIT.
    • Usa LIMIT 1 Cuando sólo quieras una única fila; en estos casos, añadir LIMIT 1 a tu query puede mejorar significativamente la velocidad. De esta forma la base de datos dejará de escanear resultados en el momento que encuentre uno, en lugar de recorrer toda la tabla o un índice.
    • Esto es a la vez un consejo de rendimiento y de seguridad. Si estamos seguros de que vamos a borrar un registro de la tabla, entonces podemos añadirle un LIMIT 1 al final y así nos aseguraremos que no se borrará en ninguno de los casos nada fuera de control. Esto es aplicable también para SELECTs y UPDATEs.
    • Cuando la cantidad de resultados a devolver por MySQL no va a ser utilizada en su conjunto, como cuando se usa un paginador, devolver la cantidad apropiada utilizando la cláusula LIMIT.
  • Pruebe sus consultas con anterioridad, mediante el comando EXPLAIN; utilizar la palabra clave EXPLAIN te dará muchos detalles internos de lo que hace MySQL para ejecutar tu consulta.
    • Gracias a EXPLAIN podemos obtener toda la información sobre el modo en el que una consulta SQL se ejecutaría en el servidor. Es extremadamente útil para conocer la configuración de índices en las tablas, los índices que podrían ser configurados para mejorar su rendimiento, el número de filas que se revisan, el tipo de query, etc.

Ejemplo:

      mysql> EXPLAIN SELECT * FROM table;
  • Optimizar la cláusula WHERE:
    • Evite el uso de paréntesis innecesarios.
    • Use COUNT (*) sólo en consultas sin cláusula WHERE y que afecten a una única tabla.
    • Si conoce que el resultado de una claúsula GROUP BY o DISTINCT va a ser muy reducido haga uso de la opción SQL_SMALL_RESULT. MySQL usará tablas temporales de acceso rápido para el resultado en vez métodos de ordenación.
  • Especificar el alias de la tabla delante de cada campo definido en el SELECT, esto le ahorra tiempo al motor de tener que buscar a que tabla pertenece el campo especificado.
  • Utilizar INNER JOIN, LEFT JOIN, RIGHT JOIN, para unir las tablas en lugar del WHERE, esto permite que a medida que se declaran las tablas se vayan uniendo mientras que si utilizamos el WHERE el motor genera primero el producto cartesiano de todos los registros de las tablas para luego filtrar las correctas, un trabajo definitivamente lento.
  • No uses ORDER BY RAND(); el problema es que MySQL tendrá que ejecutar RAND() (que requiere de potencia de procesado) para cada una de las filas antes de ordenarlas y devolver una simple fila.
  • Usa NOT NULL si puedes; las columnas NULL requieren espacio adicional en la fila a grabar donde los valores son NULL. Para las tablas MyISAM, cada columna NULL toma un bit extra, redondeando hacia arriba al byte más cercano.
Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s