usar type optimizar entender eficientes crear consultas con mysql sql-execution-plan

type - ¿Cómo uso EXPLAIN para*predecir*el rendimiento de una consulta MySQL?



type explain mysql (3)

Creo que si quieres tener la posibilidad de construir algo razonablemente confiable a partir de esto, lo que debes hacer es crear un modelo estadístico a partir de tamaños de tabla y componentes de resultados EXPLAIN desglosados ​​correlacionados con los tiempos de procesamiento de consultas. Tratar de construir un predictor de tiempo de ejecución de consultas basado en pensar sobre los contenidos de un EXPLAIN va a pasar demasiado tiempo dando resultados embarazosamente pobres antes de que se refine a una vaga utilidad.

Estoy ayudando a mantener un programa que es esencialmente un front-end amigable de solo lectura para una base de datos MySQL grande y complicada: el programa crea consultas SELECT ad-hoc a partir de los comentarios de los usuarios, envía las consultas al DB, obtiene los resultados, los post-procesa, y los muestra muy bien de vuelta al usuario.

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 '' estoy "yendo contra la corriente" de la forma en que el DB está indexado) 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étera etcétera.

No estoy muy familiarizado con la declaración EXPLAIN de MySQL. Veo mucha información sobre cómo usarla para optimizar una consulta o un esquema de DB, indexación, etc., pero no mucho sobre cómo usarla para mi propósito más limitado. - simplemente haga una predicción, tomando el DB como dado (por supuesto, si las predicciones son lo suficientemente confiables, eventualmente podré usarlas también para elegir entre formas alternativas que una consulta podría tomar, pero, eso es para el futuro: por ahora, Estaría muy contento de solo mostrarle a los usuarios las estimaciones de rendimiento para los fines mencionados anteriormente).

¿Alguna sugerencia ...?


EXPLAIN no le dará ninguna indicación de cuánto tiempo llevará una consulta. En el mejor de los casos, podría usarla para adivinar cuál de las dos consultas podría ser más rápida, pero a menos que una de ellas esté obviamente mal escrita, incluso eso será muy difícil.

También debe tener en cuenta que si usa subconsultas, incluso ejecutar EXPLAIN puede ser lento (casi tan lento como la consulta en algunos casos).

Hasta donde yo sé, MySQL no proporciona ninguna forma de estimar el tiempo que una consulta tardará en ejecutarse. ¿Podría registrar el tiempo que tarda cada consulta en ejecutarse y, luego, generar un presupuesto basado en el historial de consultas similares anteriores?


MySQL EXPLAIN tiene una columna llamada Key . Si hay algo en esta columna, esta es una muy buena indicación, significa que la consulta usará un índice.

Las consultas que usan indicios generalmente son seguras porque el diseñador de la base de datos las pensó cuando diseñó la base de datos.

sin embargo

Hay otro campo llamado Extra . Este campo a veces contiene el texto using_filesort .

Esto es muy muy malo Esto significa literalmente que MySQL sabe que la consulta tendrá un conjunto de resultados más grande que la memoria disponible y, por lo tanto, comenzará a intercambiar los datos en el disco para ordenarlos.

Conclusión

En lugar de tratar de predecir el tiempo que tarda una consulta, simplemente observe estos dos indicadores. Si una consulta está using_filesort , denegar al usuario. Y dependiendo de qué tan estricto quieras ser, si la consulta no está utilizando ninguna clave, también debes negarla.

Lea más sobre los resultados de la declaración EXPLAIN de MySQL