Mejora el rendimiento de MySQL

Introducción

En este post veremos como podemos mejorar el rendimiento de nuestras bases de datos MySQL de maneras realmente sencillas en su mayoría. Reducir el tiempo en consultas de MySQL puede redundar en un aumento importante en la parte del servidor. Ten en cuenta que es muy importante tomar estas medidas una cada vez, y centrarse en lo que realmente reduce el tiempo de las consultas sustancialmente.

Suele ser mejor marcarse objetivos, como mejorar el rendimiento un 20% que hacerlo de forma descontrolada. Así que veamos punto por punto como hacerlo.

Logo MySQL

Asegúrate de seleccionar lo que necesites

Cuando hagas una consulta tienes que ser consciente de que cada campo ocupa un espacio que se va a multiplicar por las filas que traigas. Nunca hagas algo como esto:

1
2
3
SELECT *
FROM edificios
WHERE nombre = "casa"

Así que cada vez que hagas una consulta intenta seleccionar sólamente lo que quieras, y nada más.

1
2
3
SELECT id, altura
FROM edificios
WHERE nombre = "casa"

Y probablemente pienses, bueno ¿y qué pasa cuando selecciono absolutamente todos los campos? Pues que tampoco deberías utilizar el asterisco, no ya por la velocidad, sino por escribir código legible. Así que quédate con que, como regla general, es mejor no usar nunca el asterisco en los SELECT y escribir todos los campos que queremos recuperar separados por comas.

Usa la caché

Si haces más lecturas que escrituras deberías usar la caché, ésta proporciona una mejora en el rendimiento bastante notable. En la gráfica tienes unas pruebas de MySQL Performance Blog.

Caché MySQL

Por supuesto son pruebas puntuales, pero nos sirven para hacernos una idea de cuánto puede mejorar el rendimiento. Lo importante es que tengas claro que siempre que pueda la caché guardará los resultados de las consultas SELECT, para devolverlos sin tener que consultar realmente la base de datos, cuando se haga otra vez la misma consulta.

Puede parecer un poco raro que hagas 20 veces la misma consulta a la base de datos, pero eso es exáctamente lo que suele pasar en la mayoría de páginas en Internet. Por ejemplo si tienes una página de anuncios de coches y quieres mostrar los anuncios por ciudades, lo más normal es tener una tabla de ciudades así que harás algo como esto:

1
2
3
SELECT nombre
FROM ciudades
WHERE pais="España"

Pues bien, si entran 200 personas al día a tu página, tendrás que hacer 200 veces esta consulta si no tienes la caché funcionando. Si por el contrario la caché esta activa sólo sería 1, mientras las ciudades no cambien de nombre (que no suele pasar muy a menudo… =)).

Entiende la caché

Cuando tienes que usar tiempos en las consultas, algo que es muy normal, podría darse el caso de que tuvieras algo como esto:

1
...WHERE fecha_fabricacion >= CURRENT_DATE() - INTERVAL 7 DAY

Si te fijas aquí tienes una función (CURRENT_DATE) que no se puede cachear, porque a cada momento que la ejecutes vas a tener un tiempo diferente.

Solución: pasa la fecha desde el script, ya sea PHP, Python…etc. De esa forma esa consulta que puede devolver 50 registros, se cacheará y si se hace 200 veces al día no la tendrá que hacer siempre de nuevo, lo cierto es que estamos hablando de bastante RAM ahorrada.

Conoce los tipos de datos

Cuando estemos creando las tablas tenemos que ser conscientes de que cada tipo de dato ocupa más o menos si se llena o no. Se que puede sonar un poco confuso, así que veamos un ejemplo concreto.

Tipos Datos MySQL

Como puedes ver en la imagen, si vamos a almacenar un número tenemos que ver el rango en el que va a estar, de esa forma no desaprovechamos bytes. Que no es tanto por el espacio en disco, que normalmente suele sobrar, sino más por las veces que recuperemos datos de la tabla.

Uso de LIMIT

Es muy importante que entendamos LIMIT. Básicamente reduce al número que le pasemos lo que devuelve la consulta. Por ejemplo:

1
2
3
SELECT nombre
WHERE edad = 25
LIMIT 1

Esto devolverá: un registro si tenemos en la tabla alguien con edad 25 o nada. Así, si lo que queremos mostrar es una persona en este caso el uso de LIMIT nos evita tener que sacar más registros de la base de datos cuando realmente no vamos a usarlos.

Por otra parte cuando vayamos a hacer un INSERT o un DELETE muy grande es mejor hacerlo poco a poco usando LIMIT, en vez de todo a la vez, y esto es porque el rendimiento del servidor entero (y por lo tanto de nuestra web de cara a los usuarios) puede verse afectado.

Extra. Usa un ORM

Esto es más una cuestión de facilitarnos la vida que otra cosa, pero es que realmente nos puede ayudar mucho. La idea básicamente consiste en tener una serie de clases con sus atributos y relaciones que correspondan con las tablas que tenemos en la base de datos. Haciendo algo como:

1
2
3
4
5
6
<?php
	$coche = new Coche();
	$coche->color = "rojo";
	$coche->caballos = 223;
	$coche->save(); //Guarda el objeto en la base de datos
?>

Tendremos en la base de datos una tabla coches, y cuando hacemos save() se ejecuta una consulta INSERT. Como puedes ver es muy cómodo y nos evitamos tener que hacerlo nosotros mismos en la clase o simplemente cuando establecemos los atributos. Este ejemplo es de Doctrine, pero hay otras alternativas como Propel, Qcodo o pdoMap.

Por supuesto en todas debes instalar el ORM para que funcione como es debido, pero la base de datos se suele generar sola, acorde con las clases que tengas, lo cual es una gran ventaja. Y lo cierto es que tienen otras muchas ventajas, que dan para un post ellas solas.

Conclusión

Lo cierto es que hay muchas más medidas a tomar pero estas te pueden servir como guía para empezar. En cualquier caso, si te ha interesado el tema, aquí tienes enlaces donde aprender más.