Profilo MySQL sulla query "Creazione di un indice di ordinamento" utilizzando il 75% del tempo totale


11

Stiamo cercando di capire come ottimizzare una query (impiegando circa 100 ms) e eseguendo il profilo che vediamo Creating Sort Indexutilizzando 75%il tempo totale. Innanzitutto, quali sono esattamente gli effetti che creano l'indice di ordinamento? È disk / io?

Secondo, esiste qualche ottimizzazione che possiamo apportare alla query stessa?

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

Spiegare: Immagine dello schermo

Risposte:


6

Abbiamo avuto un problema simile per enormi domande. Spesso le query venivano eseguite per ore (fino a 7-8) a seconda del carico sul DB per 400 milioni di righe. Tuttavia, il nostro obiettivo era quello di ottenere risultati di gruppo, come selezionare col1, col2, col3, count (1), count (distinto col4) dal gruppo di tabelle di 1,2,3.

Il problema di fondo è uguale al tuo, però, poiché in entrambi i casi DB ordina (ordina) i risultati internamente.

  • Come funziona la creazione dell'indice di ordinamento. Sul sito Web mysql dice "Il thread sta elaborando un SELECT che viene risolto usando una tabella temporanea interna". Secondo la mia comprensione dell'algoritmo, il sistema sta molto probabilmente dividendo i dati in blocchi, leggendo dal disco questi blocchi uno per uno, ordinando i singoli blocchi, rimettendoli in un po 'di spazio temporaneo sul disco e così via. Il sistema esegue questa operazione per tutti i blocchi e infine esegue l'ordinamento di tipo merge. Ciò comporta ampie letture / scritture.

Una possibile soluzione può essere quella di aumentare la memoria per DB (in modo che possa creare blocchi più grandi che possano rimanere in memoria) o se si dispone di una memoria più grande altrove, è possibile programmare la soluzione eseguendo lo streaming dal DB. Ciò può essere ottenuto in tempo nlogn.

A livello di programmazione, potrei ridurre il tempo da una media di 2 ore a un consistente 7,5 minuti.


4

"Creazione di un indice di ordinamento" è il database che determina l'ordine dei valori restituiti in base alla clausola "ordina per". I principali limitatori qui sarebbero la velocità CPU / CPU disponibile e la larghezza di banda della memoria. L'ordinamento non verrà eseguito fino a quando i dati non saranno già tutti in memoria, almeno per una query così piccola. Se esegui il profilo della query, vedi qualche attesa per qualche risorsa?

Per rendere più veloce questa query, potresti prendere in considerazione l'aggiunta di un indice su "r.added", poiché non sembra che ce ne sia uno secondo la tua spiegazione.


Le ricette addedhanno davvero un indice standard.
Justin il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.