12

Si tiene una aplicación de tren con muchos modelos complejos asociados, ¿qué técnicas emplea para reducir las consultas a la base de datos?Técnicas para reducir consultas de bases de datos en una aplicación de Rails

De hecho, voy a extender esa pregunta un poco más y preguntar, ¿qué considera "demasiadas" consultas para cualquier página?

Tengo una página que, según creo, terminará llegando a la base de datos unas 20 veces por cada carga de página. Me preocupa pero no sé si debería preocuparme o qué puedo hacer para reducir la carga.

Respuesta

14

Salida: bullet

Su una gran manera de identificar n + 1 consultas y ofrece sugerencias para minimizarlo.

Reduce el modo de desarrollo, así que asegúrese de deshabilitarlo cuando no esté afinando el rendimiento.

Mientras estamos en ello, también comprobación: rails_indexes

Una forma sencilla de identificar los índices de su aplicación podría faltar.

Ajuste feliz.

+0

¿Cómo reduce realmente la carga de la base de datos? Por caché de memoria? –

-1

Es realmente difícil estimar un límite para las consultas. Esto está relacionado con el concepto/diseño de su aplicación.

Si no tiene que volver a cargar toda la página, le sugiero que considere javascript (o rjs) para actualizar solo los datos que necesita. Esto también debería ser una mejora de UI, ¡a tus usuarios les encantará!

Compruebe el SQL generado a partir de sus consultas de ActiveRecord. Asegúrate de que todo sea como esperabas.

Considere la desnormalización de su base de datos con el fin de mejorar el rendimiento. (tenga cuidado)

Esto es lo que veo desde el "lado del código".

10

Una práctica común es el uso juicioso de la opción include =>: association.

Por ejemplo en un controlador que puede hacer:

def show 
    @items = Item.find(:all) 
end 

... y la vista muestran haría algo así:

<% @items.each |item| %> 
    <%= item.product.title %> 
<% end %> 

Esto creará una consulta para cada llamada al producto. Pero si se declara la asociación incluyó la siguiente manera, se obtiene asociaciones cargadas con gran entusiasmo en una consulta:

def show 
    @items = Item.find(:all, :include => :product) 
end 

Como siempre, verifique su consola de tiempos de consulta y tal.

0

Estoy utilizando: une y selecciona opciones si solo necesita mostrar datos. Encontré muy útil named_scope para definir todo lo posible: joins y uno: select_columns named_scope.Ejemplo

class Activity < ActiveRecord::Base 
     belongs_to :event 
     belongs_to :html_template 
     has_many :participants 

     named_scope :join_event, :joins => :event 
     named_scope :join_owner, :joins => {:event => :owner} 
     named_scope :left_join_html_template, 
     :joins => "LEFT JOIN html_templates ON html_templates.id = activities.html_template_id" 
     named_scope :select_columns, lambda { |columns| {:select => columns}} 
     named_scope :order, lambda{ |order| {:order => order}} 
end 

Así que ahora usted puede construir fácilemte consultas así:

columns = "activities.*,events.title,events.owner_id,owners.full_name as owner_name" 
@activities = Activity.join_event.join_owner.order("date_from ASC").select_columns(columns) 

Considero que esta no es la mejor y más segura, pero en mi caso lo que realmente Minify recuento de consulta que se ejecuta por la petición y aún no se han producido errores sobre algunas consultas generadas incorrectas.

Cuestiones relacionadas