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
22421Puntos
5 años

Muchas gracias tomaré en cuenta tus consejos. Saludos

1
18957Puntos
5 años

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

1
un año

Excelente información de como realizar consultas en la base de datos, muchas gracias por compartir y espero sigan creando este tipo de contenidos para seguir aprendiendo.
Les comparto un manual de como instalar mysql ya que en su momento me costo mucho trabajo para realizar dichas consultas

1
2697Puntos
5 años

Excelentes recomendaciones, gracias.

1
28728Puntos
5 años

Esta bueno el aporte, gracias.

0
6634Puntos
2 años

¡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.