2012-05-03 14 views
7

Ho un database con una tabella 'voti' utente e una tabella 'utente'. Sto pensando che il database diventerà abbastanza grande in una piccola quantità di tempo, quindi voglio usare il metodo più efficiente.COUNT() funzione ogni volta o memorizza il valore e lo incrementa di uno?

Penso che sia possibile COUNT() l'ammontare di voti con una dichiarazione WHERE dalla tabella 'voti' ogni volta, o posso memorizzare il punteggio nella tabella 'utente' e solo incrementarlo di 1 ogni ora viene aggiunta una votazione.

Quale sarebbe il migliore/il più veloce e/o ci sono altri modi per farlo?

risposta

2

Se stai pensando al modo migliore per farlo. Devi guardare molto all'ottimizzazione e al caching.

Direi, Creare una colonna nelle tabelle utente per memorizzare lo spartito memorizzato nella cache, ma mantenere il punteggio nella tabella separata.

Ogniqualvolta le modifiche ai punteggi operano nella tabella dei punteggi e attivano un aggiornamento sulla tabella dell'utente con il risultato del punteggio più recente.

In questo modo è possibile estendere i dati del punteggio a un tipo di stackoverflow utilizzato per i voti.

+0

"_Crea una colonna sulle tabelle utente per memorizzare il punteggio memorizzato nella cache" "Intendi che il motore DB lo memorizzerà e non il programmatore? –

+0

@ Mr.TAMER, mi dispiace, ma non capisco la tua implicazione con il termine "non un programmatore". – Starx

2

Nella configurazione corretta (la configurazione predefinita è abbastanza buona nella maggior parte dei casi) il server MySQL 5.0+ memorizza nella cache SUM, COUNT query, quindi MySQL gestisce automaticamente questo tipo di query.

Tuttavia, se si utilizza una versione precedente (MySQL 4 o inferiore), si consiglia di memorizzare i valori COUNT (*) nel database, in quanto ciò può causare realmente prestazioni su tabelle più grandi.

Edit: migliori pratiche ho scoperto sta facendo una query COUNT (*) ogni volta che l'utente sta aggiungendo/Cancellazione voto/commento ecc server SQL moderni gestiscono le query di gruppo molto bene, in modo che non devono preoccuparsi sulla perfomance.

+0

C'è qualche rischio di risultati errati se COUNT cambia così tanto? –

+0

IMO La procedura migliore consiste nel fare una query COUNT (*) ogni volta che l'utente aggiunge/elimina voti/commenti ecc. In ogni caso i moderni server SQL gestiscono le query di gruppo molto bene. – Peter

+0

"MySQL 5.0+ server memorizza nella cache SUM, COUNT query, quindi MySQL sta gestendo automaticamente quel tipo di query. "--- a cosa si basa la tua ipotesi? Per memorizzare o meno nella cache - dipende da ** un sacco ** di criteri – zerkms

0

Il calcolo preliminare è una delle ottimizzazioni spesso denormalizzanti.

Quindi basta creare la colonna precalcolata e mantenerla con i trigger o il codice dell'applicazione.

Come ha sottolineato @Bohemian: è necessario farlo solo se si verificano problemi di prestazioni.

+0

+! Questo è quello che farei, ma solo se le prestazioni diventassero un problema. Ottimizza l'ultimo - fallo funzionare prima. – Bohemian

+0

@Bohemian: questo è quello che ho assunto in sottofondo :-) – zerkms

0

È un compromesso in termini di costi e complessità. Mantenendo il conteggio nella tabella utente, aggiunge una certa complessità per mantenerlo accurato e aggiunge costi per l'inserimento/eliminazione dei voti. Significa che aggiungere un voto richiede (almeno) l'aggiornamento di due tabelle.

Quindi dipende un po 'da quale pezzo deve essere il più efficiente. Se il recupero del conteggio dei voti viene eseguito un numero estremamente grande di volte, allora forse ha senso mantenere il conteggio.

A mio parere, tuttavia, sarebbe meglio andare prima con l'implementazione più semplice e assumere che il database sarà in grado di ottimizzare la query e renderla un non-problema. Se questo risulta non essere abbastanza veloce, quindi apportare le modifiche per aggiungere il conteggio pre-calcolato più tardi.

Problemi correlati