Aplicação Rails - como otimizar / reduzir chamadas de banco de dados ao iterar em uma coleção

5

Qual é a melhor maneira de otimizar um aplicativo Rails onde você precisa extrair informações do banco de dados para uma coleção de itens?

Por exemplo, se eu estiver criando um sistema de fóruns on-line ... eu teria um número de Posts e as postagens teriam_minha_de_origem :recommendations e :comments e :favorites . Quando exibo as postagens na minha opinião, talvez eu precise exibir essas informações, como uma contagem de quantos comentários existem e se meu usuário atual favoritou / recomendou a postagem.

Eu estava brincando com isso e parece que há um grande número de consultas DB sendo executadas! Primeiramente eu estou pegando minha coleção de posts - então, iterando através de cada um, eu estou indo para a tabela de comentários, a tabela de favoritos, etc ... para obter contagens ou ver se existem registros para aquele post em particular. Então, para cada post que tenho, estou executando 3 consultas separadas!

Existe uma maneira mais eficiente de obter esses dados, ou são toneladas de consultas como essa normais para um cenário como eu descrevo?

    
por Jim 11.07.2012 / 23:01
fonte

1 resposta

3

Se informações como quantos comentários, votos favoráveis e favoritos forem frequentemente usados, é melhor guardar essas contas em algum lugar; consultar o banco de dados toda vez que houver um número de comentários em um post, o número de seguidores que um usuário tiver, etc. poderá muito em breve se tornar o seu gargalo de desempenho.

Existem duas abordagens comuns:

  1. Adicione coluna / campo para Posts no banco de dados que armazena a contagem de comentários. quando novos comentários são adicionados, aumente o campo do contador em um (síncrona) ou atualize essa contagem a cada hora / dia (de forma assíncrona).

  2. Use o cache (memcache, redis) para armazenar esses números para reduzir as consultas ao banco de dados. Geralmente, o cache de memória é necessário para sites de alto tráfego.

De qualquer forma você pode tecer em sua Camada ORM / Abstraction, então não haverá muito código adicional envolvido. Para vantagens / desvantagens, há muitas discussões / debates sobre esse assunto na Internet. Google-lo para explicações detalhadas e detalhadas:)

    
por 14.07.2012 / 04:49
fonte