Mysql
 sql >> Database >  >> RDS >> Mysql

Ottimizzazione delle query sull'utilizzo dell'indice MySQL

Alcune cose... Avrei un SINGOLO indice composto su( a_id, job, state, start_time )

Questo per aiutare a ottimizzare la query su tutti i criteri, in quella che credo sia la sequenza meglio sintonizzata. Un singolo "A_ID", quindi due lavori, un piccolo intervallo di stato, quindi basato sul tempo. Quindi, non notare le virgolette... Sembra che tu stia convertendo i confronti numerici in stringhe, lasciali come numerici per il confronto, più velocemente delle stringhe.

Inoltre, avendoli tutti come parte dell'indice, è un indice COVERING, il che significa che NON deve andare ai dati della pagina grezza per ottenere gli altri valori per testare i record di qualificazione da includere o meno.

SELECT 
      count(*) AS tries 
   FROM 
      tasks
   WHERE 
          a_id = 614
      AND job IN ( 1, 3 ) 
      AND state > 80 AND state < 100 
      AND start_time >= 1386538013;

Ora, il motivo per cui l'indice... considera il seguente scenario. Hai due stanze che hanno caselle... Nella prima stanza, ogni casella è un "a_id", all'interno ci sono i lavori in ordine, all'interno di ogni lavoro ci sono gli intervalli di stato e, infine, l'ora di inizio.

In un'altra stanza, le tue caselle sono ordinate per ora di inizio, all'interno di quella a_id sono ordinate e infine per stato.

Il che sarebbe più facile trovare ciò di cui hai bisogno. È così che dovresti pensare agli indici. Preferirei andare in una casella per "A_ID =614", quindi passare al lavoro 1 e un altro per il lavoro 3. All'interno di ogni lavoro 1, lavoro 3, prendi 80-100, quindi il tempo. Tuttavia, conosci meglio i tuoi dati e il volume in ogni considerazione sui criteri e puoi modificare.

Infine, count(ID) vs count(*). Tutto quello che mi interessa è un record qualificato. Non ho bisogno di conoscere l'ID effettivo poiché i criteri di filtraggio sono già qualificati come inclusi o meno, perché cercare (in questo caso) l'"ID" effettivo.