Applicazione Rails: come ottimizzare / ridurre le chiamate al database durante l'iterazione su una raccolta

5

Qual è il modo migliore per ottimizzare un'app Rails in cui è necessario estrarre informazioni dal database per una raccolta di elementi?

Ad esempio, se sto creando un sistema di forum online ... avrei un numero di Posts e i post avrebbero have_many :recommendations e :comments e :favorites . Quando visualizzo i post nella mia vista, potrei dover visualizzare queste informazioni, ad esempio il conteggio di quanti commenti ci sono e se il mio utente ha preferito o consigliato il post.

Stavo giocando con questo e sembra che ci sia un numero enorme di query DB in esecuzione! Per prima cosa sto afferrando la mia raccolta di post, quindi, passando da ognuno di essi, andrò alla tabella dei commenti, alla tabella dei preferiti, ecc ... per ottenere i conteggi o vedere se esistono dei record per quel particolare post. Quindi per ogni post che ho, sto eseguendo 3 query separate!

Esiste un modo più efficiente per ottenere questi dati o sono tonnellate di query come questa normale per uno scenario come quello che descrivo?

    
posta Jim 11.07.2012 - 23:01
fonte

1 risposta

3

Se le informazioni come il numero di commenti, voti positivi, preferiti di un post sono frequentemente utilizzati, è meglio archiviare questi conteggi da qualche parte; interrogando il DB ogni volta per il numero di commenti in un post, il numero di follower di un utente, ecc. potrebbe presto diventare il collo di bottiglia delle prestazioni.

Esistono due approcci comuni:

  1. Aggiungi colonna / campo per Posts nel database che memorizza il conteggio dei commenti. quando vengono aggiunti nuovi commenti, aumenta il campo contatore di uno (in modo sincrono) o aggiorna il conteggio ogni ora / giorno (in modo asincrono).

  2. Usa la cache (memcache, redis) per memorizzare quei numeri per ridurre le query del database. La cache di memoria di solito è necessaria per siti ad alto traffico.

In ogni caso puoi tessere nel tuo ORM / Abstraction Layer, quindi non ci sarà troppo codice addizionale coinvolto. Per vantaggi / svantaggi, ci sono un sacco di discussioni / dibattiti su questo tema in rete. Google per spiegazioni approfondite e dettagliate:)

    
risposta data 14.07.2012 - 04:49
fonte

Leggi altre domande sui tag