AMS

2017-04-19 23 views
5

ile büyük veri grafiği sorgulaması ve oluşturulmasını hızlandırma Sonunda, verileri oluşturmak için Active Model Serileştiricileri kullanan birden çok tablo içeren bir sorgu var. Halihazırda zamanın büyük bir kısmı serileştiricilerde harcanmaktadır, çünkü seri hale getiricinin içinden gelen bazı verileri sorgulamak zorunda kalıyoruz. Bunu hızlandırmak için bir yol bulmak istiyorum ve bu AMS kullanmıyor olabilir (bu iyi bir şey).AMS

Location 
    -> Images 
    -> Recent Images 
    -> Days Images 
Image 
    -> User 

recent_images ve days_images anda 6.

bir gün filtrelemek için where ve limit yapmak images olarak değil, kapsamı ile aynıdır şu şekildedir:

Benim veri modeli Bu işlem yerel olarak yaklaşık 15 saniye ve üretimde 2-4 saniye sürer. Bu kadar hızlı çalışabiliyormuşum gibi hissediyorum, ancak kodumu nasıl değiştirebileceğime emin değilim.

sorgu

Location s getirmesi:

ids = @company 
    .locations 
    .active 
    .has_image_taken 
    .order(last_image_taken: :desc) 
    .page(page) 
    .per(per_page) 
    .pluck(:id) 
Location.fetch_multi(ids) 

fetch_multiidentity_cache mücevher değil.

class V1::RecentLocationSerializer < ActiveModel::Serializer 
    has_many :recent_images, serializer: V1::RecentImageSerializer do 
    if scope[:view_user_photos] 
     object.fetch_recent_images.take(6) 
    else 
     ids = object.recent_images.where(user_id: scope[:current_user].id).limit(6).pluck(:id) 
     Image.fetch_multi(ids) 
    end 
    end 

    has_many :days_images do 
    if scope[:view_user_photos] 
     object.fetch_days_images 
    else 
     ids = object.days_images.where(user_id: scope[:current_user].id).pluck(:id) 
     Image.fetch_multi(ids) 
    end 
    end 
end 

son ve günleri görüntüler için kapsamları geçerli:: Eğer ben o yüzden gerek yok AMS hendek gerekir düşünüyorsanız

scope :days_images, -> { includes(:user).active.where('date_uploaded > ?', DateTime.now.beginning_of_day).ordered_desc_by_date } 
scope :recent_images, -> { includes(:user).active.ordered_desc_by_date } 

Benim sorum Bu sonuçlar daha sonra seri hale vurmak serializer'da sorgulayın ve eğer öyleyse, bunu nasıl oluşturmanızı önerirsiniz?

cevap

1

Buradaki noktayı kaçırmış olabilirim - hangi bölüm yavaştır? Günlükler nasıl görünüyor? Bir db dizini eksik misiniz? Orada çok fazla katılmıyorum, bu yüzden belki sadece date_uploaded (ve belki de user_id) dizinine ihtiyacın var. Orada bir dizi serileştirme yapan bir şey göremiyorum.

sql'yu birçok şekilde hızlı bir şekilde hızlandırabilirsiniz - örneğin, bir birleştirici dökümü ile görüntüyü güncelleyen bir tetikleyici (yakut veya sql) gibi bir kullanıcı tarafından etkinleştirilebilir. (dizine bunu dahil edersiniz)

VEYA kimlikleri içeren önbelleğe alınmış bir tablo oluşturun. Her ne kadar bir resim yüklendiğinde güncellenen her kullanıcı/konum için bir satırı olan tersine çevrilmiş bir dizin gibi (redis içinde de yapabilirim, ama benim).

İşi, görüntüyü şimdi olduğu konum yerine değil, listeye bakarak itin.

+0

Sorgunun yavaş kısmı, serializer'ın getirmeyi gerçekleştirmesi ve dolayısıyla bir N + 1 sorgusu gerçekleştirmesidir. Konumlar için sorgulama kolaydır, ancak serileştiriciler daha sonra her bir konum için bir sorgulama yapar, 1 gün görüntüleri için 1 ve son görüntüler için 1'dir. Hızlı bir şekilde balonluyor ve – CWitty

+0

daha kolay bir çözüm bulmayı umuyordum, benim nokta standlarım - böyle bir şekilde yeterince büyük 3 yönlü bir sorguya sahip olduğunuzda, bir kullanıcı karşıya yüklediğinde güncellediğiniz tüm arama sonuçlarını gösteren bir tablo oluşturuyorsunuz bir şekil. Nispeten az sayıda resmin yüklendiğini ve çok sayıda sorgunun olduğunu varsayarak, sorguları optimize eder ve görüntüyü tüm arama sonucu tablolarına ekleyen tetikleyiciler/geri aramalarla, yükleme sırasında 'arama' işlemini yaparsınız. – court3nay

+0

bunu akıllıca bir şeyle yapabilirsin ama bu daha sonra seni ısırır. Bir arama sonucunu temsil eden ve bunların bir demetini oluşturan yeni bir model oluşturun. modeller ucuz, kod karmaşıklığı ve hack zor (gelecek için). – court3nay