के साथ मटेरियलाइज्ड व्यूज़ (सारांश टेबल्स) के लिए पसंदीदा विधि मैं काम पर एक प्रोजेक्ट विकसित कर रहा हूं जिसके लिए मुझे प्रदर्शन कारणों के लिए सारांश सारणी बनाने और बनाए रखने की आवश्यकता है। मेरा मानना है कि इसके लिए सही शब्द सामग्री दृश्य है।MySQL
असमान्यीकरण
मैं टेबल के रूप में ज्यादा सामान्यीकृत संभव के रूप में:
2 मुख्य कारण यह करने के लिए किया है। ऐसे में ऐसी स्थितियां हैं जहां डेटा खींचने के लिए मुझे कई तालिकाओं में शामिल होना होगा। हम MySQL क्लस्टर के साथ काम करते हैं, जब जॉइन की बात आती है तो इसमें काफी खराब प्रदर्शन होता है।
तो मुझे डेनोर्मलाइज्ड टेबल्स बनाने की आवश्यकता है जो तेजी से SELECT चला सकते हैं।
संक्षेप में प्रस्तुत करना डाटा
उदाहरण के लिए, मैं कुछ मिलियन रिकॉर्ड के साथ एक लेन-देन तालिका है। लेनदेन विभिन्न वेबसाइटों से आते हैं। आवेदन को एक रिपोर्ट उत्पन्न करने की आवश्यकता है दैनिक या मासिक लेनदेन की गणना, और प्रति वेबसाइट कुल राजस्व राशि प्रदर्शित करेगा। मैं नहीं चाहता कि रिपोर्ट स्क्रिप्ट हर बार इसकी गणना करे, इसलिए मुझे एक सारांश तालिका उत्पन्न करने की आवश्यकता है जिसमें [साइट, दिनांक] द्वारा ब्रेकडाउन होगा।
यह एक साधारण उदाहरण है। उत्पन्न करने और बनाए रखने के लिए मुझे कई अलग-अलग प्रकार की सारणी तालिकाएं हैं I
अतीत में मैंने प्रत्येक सारांश तालिका को अद्यतन रखने के लिए कई क्रॉन स्क्रिप्ट लिखकर इन चीजों को किया है। लेकिन इस नई परियोजना में, मैं एक और अधिक सुरुचिपूर्ण और उचित समाधान को लागू करने की उम्मीद कर रहा हूं।
मैं, एक PHP आधारित समाधान पसंद करेंगे के रूप में मैं एक सर्वर व्यवस्थापक नहीं हूं, और मैं सबसे ज्यादा आरामदायक महसूस जब मैं अपने आवेदन कोड के माध्यम से सब कुछ नियंत्रित कर सकते हैं।
समाधान है कि मैं पर विचार किया है:
दृश्य कॉपी किया जा के
जिसके परिणामस्वरूप तालिका एक एकल चयन करें क्वेरी के रूप में प्रतिनिधित्व किया जा सकता है, तो मैं एक दृश्य उत्पन्न कर सकते हैं । चूंकि वे धीमे हैं, इसलिए एक क्रोनबॉज हो सकता है जो इस दृश्य को वास्तविक तालिका में कॉपी करता है।
हालांकि, इनमें से कुछ चयन प्रश्न इतने धीमे हो सकते हैं कि यह cronjobs के लिए भी स्वीकार्य नहीं है। यदि पुराने पंक्तियों को भी अपडेट नहीं किया जा रहा है, तो पूरे सारांश डेटा को फिर से बनाना बहुत प्रभावी नहीं है।
प्रत्येक सारांश तालिका
इस के लिए कस्टम cronjobs समाधान मैंने पहले का इस्तेमाल किया है है, लेकिन अब मैं यदि संभव हो तो इसे से बचने के लिए कोशिश कर रहा हूँ। यदि कई सारांश सारणीएं होंगी, तो यह बनाए रखने के लिए गन्दा हो सकता है।
MySQL ट्रिगर
यह मुख्य तालिकाओं के लिए चलाता जोड़ सकते हैं ताकि हर बार होती है एक सम्मिलित करें, अद्यतन या हटाने के लिए संभव है, सारांश तालिकाओं तदनुसार अपडेट कर दिया।
कोई क्रोनबॉज नहीं होगा और सारांश वास्तविक समय में होंगे। हालांकि अगर स्क्रैच से सारांश तालिका को पुनर्निर्माण करने की आवश्यकता होती है, तो इसे किसी अन्य समाधान (शायद # 1 ऊपर) के साथ किया जाना होगा।
ORM हुक्स/ट्रिगर
मैं अपने ORM के रूप में सिद्धांत का उपयोग कर रहा का उपयोग करना। इवेंट श्रोताओं को जोड़ने का एक तरीका है जो INSERT/UPDATE/DELETE पर सामान ट्रिगर करेगा, जो बदले में सारांश तालिका अपडेट कर सकता है। एक अर्थ में यह समाधान ऊपर # 3 के समान है, लेकिन इन ट्रिगर्स पर बेहतर नियंत्रण होगा क्योंकि उन्हें PHP में लागू किया जाएगा।
क्रियान्वयन विकल्प:
पूरा पुनर्निर्माण
मैं दक्षता के लिए सारांश तालिकाओं के पुनर्निर्माण के लिए, से बचने के लिए चाहते हैं, और के लिए केवल अद्यतन नए आंकड़े। लेकिन अगर कुछ गलत हो जाता है, तो मुझे मुख्य सारणी पर मौजूदा डेटा का उपयोग करके सारांश तालिका को स्क्रैच से पुनर्निर्माण करने की क्षमता की आवश्यकता होती है।
की उपेक्षा कर अद्यतन/ओल्ड डाटा
कुछ सारांश मान सकते हैं कि पुराने रिकॉर्ड कभी नहीं अद्यतन किया जाएगा या नष्ट कर दिया है, लेकिन केवल नए रिकॉर्ड डाला जाएगा पर DELETE। सारांश प्रक्रिया इस धारणा को लेकर बहुत से काम को बचा सकती है कि पुराने डेटा पर अपडेट की जांच करने की आवश्यकता नहीं है।
लेकिन निश्चित रूप से यह सभी तालिकाओं पर लागू नहीं होगा।
एक लॉग
रखते हुए मान लेते हैं कि मैं करने के लिए उपयोग नहीं होगा, या द्विआधारी MySQL लॉग का उपयोग नहीं करना चाहते हैं।
नए डेटा को सारांशित करने के लिए, सारांश प्रक्रिया को अंतिम सारांश के लिए अंतिम प्राथमिक कुंजी आईडी को याद रखने की आवश्यकता है। अगली बार जब यह चलता है, तो वह उस आईडी के बाद सबकुछ सारांशित कर सकता है। हालांकि, अद्यतन किए गए/हटाए गए पुराने रिकॉर्ड का ट्रैक रखने के लिए, इसे एक और लॉग की आवश्यकता है ताकि वह वापस जा सके और उस डेटा को फिर से सारांशित कर सके।
मैं रणनीतियों, सुझाव या लिंक मदद कर सकते हैं किसी भी तरह का स्वागत करते हैं। धन्यवाद!
सामग्री वाले विचार ऐसे विचार हैं जिन्हें अनुक्रमित किया जा सकता है (जिसे TSQL/SQL सर्वर शब्दावली में "अनुक्रमित दृश्य" कहा जाता है)। वे कुख्यात रूप से कार्यक्षमता में प्रतिबंधित हैं, और MySQL उन्हें समर्थन नहीं देता है। MySQL अन्य विक्रेताओं के साथ कार्यक्षमता की तुलना, गैर-भौतिक दृश्यों का समर्थन करता है। ओरेकल एकमात्र अन्य डीबी है जो मुझे पता है कि SQL सर्वर के अलावा, भौतिक दृश्यों का समर्थन करता है। मैं डीबी 2 करता हूं, लेकिन PostgreSQL नहीं करता है। –