Consultas MySQL con muchos JOINs

A veces uso MySQL por elección. No por mi elección, sino por la de los clientes. 🙂

Una de las cosas que más me ha roto la cabeza es optimizar queries con muchos JOINs. Recientemente, un informe requería una consulta con 25 JOINs, y al tratar de ejecutarla nuestro servidor prácticamente lloraba que por favor parásemos. Sin embargo, me he topado (al decir verdad, fue mi jefe) con una variable de configuración muy interesante a la hora de encarar este problema.

optimizer_search_depth

The maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to generate an execution plan for a query. Values smaller than the number of relations in a query return an execution plan quicker, but the resulting plan may be far from being optimal. If set to 0, the system automatically picks a reasonable vaue.

Tan fácil como establecer esta variable de configuración a 0, las queries han pasado de tardar años a pocos segundos. En concreto, queries con unos 10 JOINs pasan de tardar 40 segundos a tardar 2. Haciendo profiling parece que casi todo el tiempo se emplea en generar un plan de ejecución pero, vaya si vale la pena. (la query original nunca conseguí que acabase, tuve que quitarle elementos para ir probándola)

Esta configuración se realiza tanto a nivel de sesión como de servidor, por lo que parece una buena opción a probar si hemos terminado de tirarnos de los pelos optimizando la query. Es probable que un DB admin promedio conozca estos trucos, pero a mí me sorprende lo «escondida» que está.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.