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.