2017-04-19 14 views
5

के साथ प्रतिपादन करना मेरे पास एक क्वेरी है जो कई तालिकाओं को फैलाती है जो अंत में डेटा प्रस्तुत करने के लिए सक्रिय मॉडल सीरियलाइज़र का उपयोग करती हैं। वर्तमान में समय का एक बड़ा हिस्सा धारावाहिकों में बिताया जाता है क्योंकि मुझे धारावाहिक के भीतर से कुछ डेटा पूछने के लिए मजबूर होना पड़ता है। मैं इसे गति देने का एक तरीका खोजना चाहता हूं, और यह एएमएस का उपयोग नहीं कर रहा है (यह ठीक है)।बड़ी डेटा ग्राफ़ क्वेरी को तेज करना और एएमएस

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

recent_images और days_imagesimages के रूप में, लेकिन एक क्षेत्र के साथ एक ही करने के लिए 6.

वर्तमान में एक where दिनों से फिल्टर करने के लिए और limit करने के लिए कर रहे हैं:

मेरे डेटा मॉडल इस प्रकार है इस पूरी प्रक्रिया में स्थानीय रूप से लगभग 15 सेकंड और उत्पादन में 2-4 सेकंड लगते हैं। मुझे लगता है कि मैं इसे बहुत तेज़ कर सकता हूं लेकिन पूरी तरह से सुनिश्चित नहीं हूं कि मैं अपना कोड कैसे संशोधित कर सकता हूं।

क्वेरी लाने के लिए Location रों है:

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 मणि से है।

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 

हाल और दिनों छवियों के लिए स्कोप है:

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 } 

मेरा प्रश्न है अगर आपको लगता है मैं एम्स खाई करने के लिए की जरूरत है तो मैं की जरूरत नहीं है इन परिणामों तो serializer जो है हिट serializer में क्वेरी, और यदि हां, तो आप इसे प्रस्तुत करने की सिफारिश कैसे करेंगे?

उत्तर

1

मैं यहां बिंदु को याद कर सकता हूं - कौन सा हिस्सा धीमा है? लॉग क्या दिखते हैं? क्या आप एक डीबी इंडेक्स खो रहे हैं? मुझे वहां बहुत सारे जोड़ नहीं दिखते हैं, इसलिए शायद आपको date_uploaded (और शायद user_id) पर एक अनुक्रमणिका की आवश्यकता हो। मुझे वहां कुछ भी नहीं दिख रहा है जो धारावाहिक का एक गुच्छा कर रहा है।

आप आसानी से एसक्यूएल को कई तरीकों से तेज़ी से बढ़ा सकते हैं - जैसे ट्रिगर (रूबी या एसक्यूएल) जो छवि को उपयोगकर्ता_एक्टिव बूलियन के साथ अपडेट करता है ताकि आप उसमें शामिल हो सकें। (आप इंडेक्स में शामिल करेंगे)

या इसमें आईडी के साथ कैश की गई तालिका बनाएं। एक उलटा इंडेक्स की तरह (मैं इसे रेडिस में भी करूँगा, लेकिन यह मैं हूं) जिसमें प्रत्येक उपयोगकर्ता/स्थान के लिए एक पंक्ति है जिसे एक छवि अपलोड होने पर अपडेट किया जाता है।

सूची को देखने के बजाय, छवि अपलोड करने के लिए काम को पुश करें।

+0

क्वेरी का धीमा हिस्सा यह है कि धारावाहिक को fetch निष्पादित करना होता है और इसलिए यह एक एन + 1 क्वेरी निष्पादित करता है। स्थानों के लिए क्वेरी आसान है, लेकिन धारावाहिक तब प्रत्येक स्थान के लिए एक क्वेरी, दिन छवियों के लिए 1 और हाल की छवियों के लिए 1 क्वेरी करता है। यह जल्दी से गुब्बारे, और मैं एक आसान समाधान – CWitty

+0

सही खोजने की उम्मीद कर रहा था, मेरा बिंदु खड़ा है - एक बार आपके पास इस तरह की पर्याप्त 3-तरफा क्वेरी है, तो आप एक टेबल बनाते हैं जो सभी खोज परिणामों का प्रतिनिधित्व करता है, जिसे उपयोगकर्ता अपलोड करते समय अपडेट करते हैं एक छवि। अपेक्षाकृत कुछ छवियों को अपलोड किया जा रहा है और बहुत सारे प्रश्न हैं, आप प्रश्नों के लिए अनुकूलित करते हैं और अपलोड पर 'खोज' का काम करते हैं, ट्रिगर्स/कॉलबैक के साथ जो सभी खोज परिणाम तालिका में छवि डालते हैं। – court3nay

+0

आप कुछ चालाक चीज़ों के साथ ऐसा करने में सक्षम हो सकते हैं लेकिन यह आपको बाद में काट देगा। एक नया मॉडल बनाएं जो एक खोज परिणाम का प्रतिनिधित्व करता है और उनमें से एक समूह बनाता है। मॉडल सस्ते हैं, कोड जटिलता और हैक्स कठिन हैं (भविष्य के लिए)। – court3nay

संबंधित मुद्दे