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)
Curso de SQL y MySQL 2018