Perfil de MySQL en la consulta "Creación del índice de clasificación" utilizando el 75% del tiempo total

11

Estamos tratando de descubrir cómo optimizar una consulta (tomar alrededor de 100 ms) , y el perfil de ejecución que vemos Creating Sort Indexutiliza 75%el tiempo total. Primero, ¿qué efectos tiene exactamente la creación del índice de clasificación? ¿Es disco / io?

En segundo lugar, ¿hay alguna optimización que podamos hacer a la consulta en sí?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Explique: Captura de pantalla

Justin
fuente

Respuestas:

6

Tuvimos un problema similar para grandes consultas. A menudo, las consultas se ejecutaron durante horas (hasta 7-8) dependiendo de la carga en la base de datos para 400 millones de filas. Sin embargo, nuestro objetivo era lograr resultados grupales, como col1, col2, col3, recuento (1), recuento (col4 distintos) del grupo de la tabla en 1,2,3.

Sin embargo, el problema subyacente es igual al suyo, ya que en ambos casos DB clasifica (ordena) los resultados internamente.

  • Cómo funciona la creación del índice de clasificación. En el sitio web mysql dice "El hilo está procesando un SELECT que se resuelve usando una tabla temporal interna". Según mi comprensión del algoritmo, es muy probable que el sistema divida los datos en fragmentos, lea del disco estos fragmentos uno por uno, clasifique los fragmentos individuales, vuelva a colocar en un espacio temporal en el disco, etc. El sistema hace esto para todos los fragmentos y eventualmente realiza la fusión. Esto implica una amplia lectura / escritura.

Una posible solución puede ser aumentar su memoria para DB (para que pueda crear fragmentos más grandes que puedan permanecer en la memoria) o si tiene una memoria más grande en otro lugar, puede programar la solución transmitiendo desde DB. Esto se puede lograr en tiempo nlogn.

Programáticamente, podría reducir el tiempo de un promedio de 2 horas a 7,5 minutos consistentes.

Chandni
fuente
4

'Crear índice de clasificación' es la base de datos que calcula el orden de los valores devueltos en función de su cláusula 'ordenar por'. Los limitadores principales aquí estarían disponibles CPU / velocidad de CPU y ancho de banda de memoria. El orden no se realizará hasta que los datos ya estén todos en la memoria, al menos para una consulta tan pequeña. Si realiza un perfil de la consulta, ¿ve alguna espera por algún recurso?

En cuanto a hacer esta consulta más rápida, podría considerar agregar un índice en 'r.added', ya que no parece que haya uno según su explicación.

Unicorno Marley
fuente
De hecho, las recetas addedtienen un índice estándar.
Justin