Supponiamo, a scopo illustrativo, si esegue una libreria utilizzando un semplice MySQL "libri" tabella con tre colonne:Accelerare conteggio fila in MySQL
(id, titolo, stato)
- id è la chiave primaria
- titolo è il titolo del libro
- stato potrebbe essere un enum che descrive la b lo stato attuale di ook (ad es. DISPONIBILI, CheckedOut, TRASFORMAZIONE, MISSING)
una semplice query di riferire quanti libri cadere in ogni stato è:
SELECT status, COUNT(*) FROM books GROUP BY status
o per trovare in particolare quanti libri sono disponibili:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
Tuttavia, una volta che la tabella raggiunge milioni di righe, queste query richiedono diversi secondi. L'aggiunta di un indice alla colonna "stato" non sembra fare la differenza nella mia esperienza.
Oltre a memorizzare periodicamente i risultati nella cache o aggiornare in modo esplicito le informazioni di riepilogo in una tabella separata ogni volta che un libro cambia stato (tramite trigger o qualche altro meccanismo), esistono tecniche per accelerare questo tipo di query? Sembra che le query COUNT finiscano per esaminare ogni riga e (senza conoscere ulteriori dettagli) sono un po 'sorpreso dal fatto che questa informazione non possa in qualche modo essere determinata dall'indice.
UPDATE
Utilizzando la tabella di esempio (con una colonna indicizzata "status") con 2 milioni di righe, ho benchmark la query GROUP BY. Usando il motore di archiviazione InnoDB, la query impiega 3,0 - 3,2 secondi sulla mia macchina. Usando MyISAM, la query richiede da 0,9 a 1,1 secondi. In entrambi i casi non è stata riscontrata alcuna differenza significativa tra conteggio (*), conteggio (stato) o conteggio (1).
MyISAM è certamente un po 'più veloce, ma ero curioso di vedere se ci fosse un modo per fare una corsa di query equivalente molto più veloce (ad esempio 10-50 ms - abbastanza veloce per essere chiamati a ogni richiesta pagina web per un sito a basso traffico) senza il sovraccarico mentale di caching e trigger. Sembra che la risposta sia "non c'è modo di eseguire rapidamente la query diretta", che è quello che mi aspettavo - volevo solo assicurarmi che non mi mancasse un'alternativa facile.
Fa la differenza quando si utilizza: selezionare il conteggio (colonna_indicizzato) dal libro? –
stai usando innodb o myisam? –
@Boekwurm: Non :). mysql ottimizza la query in modo che count (indexedcolumn), count (*) e count (1) ritornino con lo stesso livello di efficienza. – Alterlife