8 lecciones aprendidas optimizando MySQL

Hace unas semanas estuve bastante entretenido optimizando una base de datos MySQL razonablemente grande, unos 18 millones de filas ocupando más de 10Gb de datos usada por un sitio web con un tráfico de más de 11 millones de visitas mensuales. No optimizar el rendimiento en este caso sería un grave error así que he aprendido y disfrutado mucho durante estos días.

Lo primero que aprendí es que los servidores de base de datos con bestias complejas –no las subestimes– y cada una de ellas tiene sus fortalezas pero tambien sus propios problemas.

Más tarde o más temprano deberás enfrentarte a comportamientos que parecen completamente contraintuitivos y toca leer mucha documentación para comprender estas cosas. En este caso, MySQL Performance Blog y la documentación de MySQL han sido de gran ayuda pero también Hack MySQL que, aunque ya no se actualiza ofrece muy buenos consejos bien explicados.

Como siemre, hacer el 80% de la optimización consume el 20% del tiempo porque suele ser relativamente sencilla. Hacer un EXPLAIN, ver los resultados, crear el índice adecuado y comprobar con EXPLAIN que funciona como debe. Con este esquema básico se puede hacer un buen trabajo simplemente sabiendo lo básico de indexación. Puede que no sean los índices más óptimos pero harán su trabajo.

Después tienes que ser paciente, crear índices no siempre es rápido. De hecho, el número, el tamaño y la heterogeneidad de las columnas afectadas aumentan el tiempo que se tarda en crear el índice. Mientras esperas lo mejor es leer buenos libros sobre MySQL o bases de datos relacionales como: Relational Database Index Design and the Optimizers.

Tienes que ser organizado. Crear índices aleatoriamente simplemente mirando un par de SELECTs lentos es algo, pero tienes que mirar con perspectiva: haz un inventario de todas las consultas de la aplicación, no importa lo poco importantes que parezcan porque si atacan a una tabla grande con un WHERE o un ORDER BY tendrán un rendimiento muy pobre. Esta lista te ayudará a organizar los índices y ver cuáles son usados y cuáles no y dónde.

Aprende bien qué significan los parámetros de configuración. MySQL tiene un montón. Simplemente aumentando los valores no desatascarás tus cuellos de botella. Si ves algo raro es posible que algún parámetro esté mal configurado y causando problemas. Hay un script PERL llamado MySQL Tuner que nos puede dar buenas pistas.

A veces te sentirás frustrado por algo que no comprendes. Si algo he descubierto es que casi todo en este campo tiene una explicación –incluso una razonable y lógica–.

Finalmente no descuides el resto de cosas. El rendimiento de la base de datos es importante pero puede que haya mucho por mejorar en tu código, ¡no eches siempre la culpa a la base de datos de todos los problemas!

Si te ha gustado esta entrada, por favor deja un comentario o suscríbete al RSS para que puedas recibir todas las novedades en tu lector de feeds favorito.
This entry was posted in Programación. Bookmark the permalink.

Leave a reply