Estoy ayudando a mantener un programa que es básicamente una interfaz amigable de solo lectura para una base de datos MySQL grande y complicada - el programa crea consultas SELECTIVAS ad-hoc de la entrada de los usuarios, envía las consultas al DB, obtiene el resultados, los post-procesa, y los muestra muy bien de vuelta al usuario.¿Cómo uso EXPLAIN para * predecir * el rendimiento de una consulta MySQL?
Me gustaría agregar alguna forma de predicción razonable/heurística para el rendimiento esperado de la consulta construida: a veces los usuarios realizan inadvertidamente consultas que inevitablemente van a llevar mucho tiempo (porque devolverán grandes conjuntos de resultados, o porque están "yendo contra la corriente" de la forma en que se indexa el DB) y me gustaría poder mostrarle al usuario cierta información "algo confiable"/adivinar cuánto tiempo va a durar la consulta. No tiene que ser perfecto, siempre y cuando no se ponga tan mal y frecuentemente fuera de sintonía con la realidad como para causar un efecto de "lobo gritón" donde los usuarios aprenden a ignorarlo ;-) En base a esta información, un el usuario puede decidir ir a tomar un café (si el tiempo estimado es de 5-10 minutos), ir a almorzar (si son 30-60 minutos), cancelar la consulta y probar otra cosa (tal vez límites más estrictos en la información que están solicitando)), etc, etc.
no estoy muy familiarizado con MySQL de sentencia EXPLAIN - veo una gran cantidad de información en torno a la manera de utilizarlo para optimizar el una consulta o un esquema de una base de datos, indexación, etc., pero no mucho sobre cómo usarlo para mi propósito más limitado: simplemente haga una predicción, tomando el DB como un hecho (por supuesto, si las predicciones son lo suficientemente confiables, eventualmente podré cambiarlas para usarlas también para elegir entre formas alternativas una la consulta podría tomar, pero, eso es para el futuro: por ahora, estaría muy contento de solo mostrar el rendimiento a los usuarios para los propósitos mencionados anteriormente).
¿Alguna sugerencia ...?
No generamos sub-consultas en este momento por lo que poco no debería ser un problema. Pero gracias de todos modos por el puntero, y por la noticia de que no hay una buena manera de estimar el costo de una consulta (malas noticias, ¡pero es mejor aprender antes de pasar tiempo ilimitado persiguiendo una quimera!). –
EXPLAIN es extremadamente útil. No estoy seguro de por qué esta es la 'respuesta'. Verifique la cardinalidad: cuanto mayor sea el número de filas, más búsquedas tendrá que hacer. Además, muestra qué índices, si los hay, se están utilizando. Esto es crítico para el rendimiento SELECCIONAR. En cuanto a las subconsultas, es muy raro que realmente se necesiten, sino que deben refactorizarse cuando sea posible para mayor claridad. –