13

10 consejos para optimizar nuestras consultas en mysql

1.- Elije el motor de almacenamiento mas apropiado

Los principales motores de búsqueda son MyISAM e InnoDB, pero existen muchos otros como Aria, TokuDB, XtraDB o archive.

MyISAM es mas apropiado en aquellos casos en los que predominen las consultas SELECT.

Sus principales características son:

  • Bloqueo a nivel de tabla

  • Mayor velocidad en consultas SELECT

  • Alta compresión

  • Búsquedas full-text

  • No soporta claves foráneas

InnoDB es mas apropiado si predomina los INSERT, UPDATE o DELETE

Sus principales características son:

  • Bloqueo a nivel de fila

  • Permite claves foraneas

  • Búsquedas full-text a partir de la versión 5.6.4

  • Permite transacciones

2.- Evita select *

Selecciona tan solo aquellas columnas que realmente vayas a utilizar.

Seleccionar mas columnas de las necesarias aumenta el tiempo que tarda en ejecutarse la consulta y el tiempo de transferencia si la BBDD está en un servidor independiente.

Bien:
SELECT id, titulo FROM tareas;

Mal:
SELECT * FROM tareas;

3.- Limita el n.º de resultados

Utiliza una clausula LIMIT si solo necesitas una determinada cantidad de resultados o si estás filtrando por id y por lo tanto solo hay un resultado como máximo.

Bien:
SELECT id, titulo FROM tareas where id = 555 LIMIT 1;

Mal:
SELECT id, titulo FROM tareas where id = 555;

4.- Evita subconsultas

Por cada subconsulta que agregues, MySQL va a realizar una query adicional por cada registro de la query principal.

Si tienes una consulta que muestra 100 resultados, realizará 100 consultas adicionales por cada subconsulta.

Bien:
SELECT t.id, t.nombre, s.salario
FROM trabajadores t
JOIN salarios s ON s.trabajador = t.id;

Mal:
SELECT t.id, t.nombre,
(SELECT salario FROM salarios AS s WHERE s.trabajador = t.id) AS ‘salario’
FROM trabajadores t;

5.- EXISTS en lugar de IN

Utiliza exists siempre que sea posible, ya que EXISTS deja de buscar cuando encuentra una coincidencia.

6.- Evita usar (%)

El wilcard (%) penaliza seriamente el rendimiento, utilízalo solo si es estrictamente necesario.

Bien:
SELECT id, usuario, password
FROM usuarios
WHERE usuario = ‘bruno’;

Mal:
SELECT id, usuario, password
FROM usuarios
WHERE usuario LIKE ‘%bruno%’;

7.- Evita usar ORDER BY RAND

Cuando agregas la claúsula ORDER BY RAND, lo que** MySQL** va a hacer es:

  • Seleccionar TODOS los registros que cumplan con tu claúcula WHERE

  • Los carga en memoria o en una tabla temporal

  • Asociar valores aleatorios a cada fila

  • Los ordena

  • Muestra N resultados de acuerdo a la claúsula LIMIT

Algunos motores de BBDD, como Oracle, ni tan siquiera permiten realizar esta acción.

8.- Guarda la bitácora en el motor ARCHIVE

Archive está pensado para guardar un gran volumen de datos.

Permite INSERT y SELECT, pero no DELETE, REPLACE o UPDATE, aunque puedes hacer un TRUNCATE para vaciar la tabla.

Este motor es un buen candidato para hacer la bitácora de nuestra app.

9 - Las columnas pequeñas son mas rápidas

Utiliza siempre el tamaño justo para la columna.

Por ejemplo, si vas a guardar un DNI, no tiene sentido tener un campo de 20 caracteres, ya que el DNI está formado por 9 caracteres.

10 - Optimiza la consulta para la cache

Algunas funciones impiden a MySQL cachear la consulta, por ejemplo, la función now() obtiene la fecha/hora actual cada vez que se ejecuta.

Una solución sería obtener la fecha en el lenguaje que estés usando junto con SQL (PHP, JAVA, etc)

Escribe tu comentario
+ 2
Ordenar por:
2
21845Puntos

Muchas gracias tomaré en cuenta tus consejos. Saludos

1
16474Puntos
4 años

Un saludo @kestiven, espero te sea de utilidad ❤️

1
2697Puntos

Excelentes recomendaciones, gracias.

1
28708Puntos

Esta bueno el aporte, gracias.

0
5077Puntos

¡Excelente contribución! Me pregunto si podría recomendarme algún curso para obtener una comprensión más profunda de todo el contenido, o al menos del punto 8 que ha capturado mi curiosidad.