2011-10-07 21 views
5

ho la seguente query:MySQL Query: la performance

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) 
    FROM forwarding 
    WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY fDate 

spieghi mi dà il seguente risultato:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE forwarding index fDate,fDate_2 fDate_2 3  1481127 Using where 

Si può vedere che c'è un sacco di dati. L'orario di lavoro totale è 12 secondi. Come posso migliorare le prestazioni? Non so cosa posso fare di più come impostare l'indice.

Ci sono i miei indici per questa tabella:

fDate (fDate, f_shop) 
fDate2(dDate), 
f_shop(f_shop) 

Grazie per il vostro aiuto.

UPDATE:

Ora ho aggiunto una colonna nella mia clausola WHERE e la query è molto più lento di prima.

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) FROM forwarding 
WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" AND f_shop=10077 GROUP BY fDate 

Ho un indice su forwardDate e su f_shop ma le prestazioni rallentano. Qual è la soluzione perfetta? Grazie

+0

Provare un indice '(fDate, cid)'. –

+0

E se 'sid' non può essere' NULL', usa 'COUNT (*)' invece di 'COUNT (sid)' –

+0

E una domanda: è 'fDate' di tipo' DATE' o 'DATETIME'? –

risposta

3

Oltre al di ypercube risposta offerto, la query in cui siete alla ricerca di un negozio particolare ... avrei un indice su

(f_shop, FDATE, cid) al fine di garantire tutte le 3 parti di l'indice sono utilizzati con il più piccolo WHERE qualificazione clausola di fronte .. nel vostro ultimo campione, hai inserito l'interesse in un negozio specifico ...

SELECT 
     COUNT(sid), 
     fDate, 
     COUNT(DISTINCT(cid)) 
    FROM 
     forwarding 
    WHERE 
      f_shop=10077 
     AND fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY 
     fDate 
+0

sì, grazie mille. L'ordine è importante per l'indice? Come potrei sapere che fDate e f_shop non sono abbastanza? – user954740

+1

@ user954740, sì, l'ordine è importante e dovrebbe essere nell'ordine del pezzo più granulare che si sta tentando di trovare in base alle query più comuni. In questo caso, presumerei F_SHOP perché potresti avere oltre 100 voci F_SHOP.Quindi, scansionando prima per intervallo di date, salterai comunque su tutti gli altri "negozi". Avendo quello nella prima posizione, stai iniziando con l'unico negozio, quindi all'interno di quello, solo l'intervallo di date che ti interessa. – DRapp