Ho una tabella con 2 milioni di righe. Ho due indici (stato, genere) e anche (compleanno).Le query MySQL su due diversi indici sono veloci, ma combinate in una query lenta. Perché?
Trovo strano che questa query sta prendendo 3,6 secondi o più DOMANDA N ° 1
SELECT COUNT(*) FROM ts_user_core
WHERE birthday BETWEEN '1980-01-01' AND '1985-01-01'
AND status='ok' AND gender='female';
stessi per questo: DOMANDA N ° 2
SELECT COUNT(*) FROM ts_user_core
WHERE status='ok' AND gender='female'
AND birthday between '1980-01-01' AND '1985-01-01';
Mentre questa ricerca sta prendendo 0,140 secondi QUERY N ° 3
select count(*) from ts_user_core where (birthday between '1990-01-01' and '2000-01-01');
Anche questa query richiede 0,2 secondi DOMANDA N ° 4
select count(*) from ts_user_core where status='ok' and gender='female'
mi aspetto che la prima query ad essere il modo più veloce, come può essere possibile questo comportamento? Non riesco a gestire così tanto tempo per questa query.
Ecco il risultato di:
So che posso aggiungere un nuovo indice con 3 colonne, ma c'è un modo per avere una query più veloce senza l'aggiunta di un indice per ogni clausola WHERE?
Grazie per i vostri consigli
Per '0.140' dove clausola è diversa. Ci possono essere miliardi di righe tra '1980-01-01' e '1985-01-01' e solo una riga tra '1990-01-01' e '2000-01-01' –
Mentre MySQL può utilizzare più indici in una query, ne sceglie una che potrebbe non essere ottimale. [Vedi questo thread, in particolare la risposta accettata.] (Http://stackoverflow.com/questions/12222630/can-mysql-use-multiple-indexes-for-a-single-query) Puoi trarre vantaggio dall'indicizzazione '(stato , genere, compleanno) '. – bishop
La prima e la seconda query sono, infatti, identiche. L'ordine delle condizioni nella clausola WHERE non è rilevante, MySQL li valuta nell'ordine che ritiene più appropriato per ottenere risultati più velocemente. – axiac