MySQL

2010-11-11 18 views
7

के साथ मटेरियलाइज्ड व्यूज़ (सारांश टेबल्स) के लिए पसंदीदा विधि मैं काम पर एक प्रोजेक्ट विकसित कर रहा हूं जिसके लिए मुझे प्रदर्शन कारणों के लिए सारांश सारणी बनाने और बनाए रखने की आवश्यकता है। मेरा मानना ​​है कि इसके लिए सही शब्द सामग्री दृश्य है।MySQL

  1. असमान्यीकरण

    मैं टेबल के रूप में ज्यादा सामान्यीकृत संभव के रूप में:

    2 मुख्य कारण यह करने के लिए किया है। ऐसे में ऐसी स्थितियां हैं जहां डेटा खींचने के लिए मुझे कई तालिकाओं में शामिल होना होगा। हम MySQL क्लस्टर के साथ काम करते हैं, जब जॉइन की बात आती है तो इसमें काफी खराब प्रदर्शन होता है।

    तो मुझे डेनोर्मलाइज्ड टेबल्स बनाने की आवश्यकता है जो तेजी से SELECT चला सकते हैं।

  2. संक्षेप में प्रस्तुत करना डाटा

    उदाहरण के लिए, मैं कुछ मिलियन रिकॉर्ड के साथ एक लेन-देन तालिका है। लेनदेन विभिन्न वेबसाइटों से आते हैं। आवेदन को एक रिपोर्ट उत्पन्न करने की आवश्यकता है दैनिक या मासिक लेनदेन की गणना, और प्रति वेबसाइट कुल राजस्व राशि प्रदर्शित करेगा। मैं नहीं चाहता कि रिपोर्ट स्क्रिप्ट हर बार इसकी गणना करे, इसलिए मुझे एक सारांश तालिका उत्पन्न करने की आवश्यकता है जिसमें [साइट, दिनांक] द्वारा ब्रेकडाउन होगा।

    यह एक साधारण उदाहरण है। उत्पन्न करने और बनाए रखने के लिए मुझे कई अलग-अलग प्रकार की सारणी तालिकाएं हैं I

अतीत में मैंने प्रत्येक सारांश तालिका को अद्यतन रखने के लिए कई क्रॉन स्क्रिप्ट लिखकर इन चीजों को किया है। लेकिन इस नई परियोजना में, मैं एक और अधिक सुरुचिपूर्ण और उचित समाधान को लागू करने की उम्मीद कर रहा हूं।

मैं, एक PHP आधारित समाधान पसंद करेंगे के रूप में मैं एक सर्वर व्यवस्थापक नहीं हूं, और मैं सबसे ज्यादा आरामदायक महसूस जब मैं अपने आवेदन कोड के माध्यम से सब कुछ नियंत्रित कर सकते हैं।


समाधान है कि मैं पर विचार किया है:

  1. दृश्य कॉपी किया जा के

    जिसके परिणामस्वरूप तालिका एक एकल चयन करें क्वेरी के रूप में प्रतिनिधित्व किया जा सकता है, तो मैं एक दृश्य उत्पन्न कर सकते हैं । चूंकि वे धीमे हैं, इसलिए एक क्रोनबॉज हो सकता है जो इस दृश्य को वास्तविक तालिका में कॉपी करता है।

    हालांकि, इनमें से कुछ चयन प्रश्न इतने धीमे हो सकते हैं कि यह cronjobs के लिए भी स्वीकार्य नहीं है। यदि पुराने पंक्तियों को भी अपडेट नहीं किया जा रहा है, तो पूरे सारांश डेटा को फिर से बनाना बहुत प्रभावी नहीं है।

  2. प्रत्येक सारांश तालिका

    इस के लिए कस्टम cronjobs समाधान मैंने पहले का इस्तेमाल किया है है, लेकिन अब मैं यदि संभव हो तो इसे से बचने के लिए कोशिश कर रहा हूँ। यदि कई सारांश सारणीएं होंगी, तो यह बनाए रखने के लिए गन्दा हो सकता है।

  3. MySQL ट्रिगर

    यह मुख्य तालिकाओं के लिए चलाता जोड़ सकते हैं ताकि हर बार होती है एक सम्मिलित करें, अद्यतन या हटाने के लिए संभव है, सारांश तालिकाओं तदनुसार अपडेट कर दिया।

    कोई क्रोनबॉज नहीं होगा और सारांश वास्तविक समय में होंगे। हालांकि अगर स्क्रैच से सारांश तालिका को पुनर्निर्माण करने की आवश्यकता होती है, तो इसे किसी अन्य समाधान (शायद # 1 ऊपर) के साथ किया जाना होगा।

  4. ORM हुक्स/ट्रिगर

    मैं अपने ORM के रूप में सिद्धांत का उपयोग कर रहा का उपयोग करना। इवेंट श्रोताओं को जोड़ने का एक तरीका है जो INSERT/UPDATE/DELETE पर सामान ट्रिगर करेगा, जो बदले में सारांश तालिका अपडेट कर सकता है। एक अर्थ में यह समाधान ऊपर # 3 के समान है, लेकिन इन ट्रिगर्स पर बेहतर नियंत्रण होगा क्योंकि उन्हें PHP में लागू किया जाएगा।


क्रियान्वयन विकल्प:

  1. पूरा पुनर्निर्माण

    मैं दक्षता के लिए सारांश तालिकाओं के पुनर्निर्माण के लिए, से बचने के लिए चाहते हैं, और के लिए केवल अद्यतन नए आंकड़े। लेकिन अगर कुछ गलत हो जाता है, तो मुझे मुख्य सारणी पर मौजूदा डेटा का उपयोग करके सारांश तालिका को स्क्रैच से पुनर्निर्माण करने की क्षमता की आवश्यकता होती है।

  2. की उपेक्षा कर अद्यतन/ओल्ड डाटा

    कुछ सारांश मान सकते हैं कि पुराने रिकॉर्ड कभी नहीं अद्यतन किया जाएगा या नष्ट कर दिया है, लेकिन केवल नए रिकॉर्ड डाला जाएगा पर DELETE। सारांश प्रक्रिया इस धारणा को लेकर बहुत से काम को बचा सकती है कि पुराने डेटा पर अपडेट की जांच करने की आवश्यकता नहीं है।

    लेकिन निश्चित रूप से यह सभी तालिकाओं पर लागू नहीं होगा।

  3. एक लॉग

    रखते हुए मान लेते हैं कि मैं करने के लिए उपयोग नहीं होगा, या द्विआधारी MySQL लॉग का उपयोग नहीं करना चाहते हैं।

    नए डेटा को सारांशित करने के लिए, सारांश प्रक्रिया को अंतिम सारांश के लिए अंतिम प्राथमिक कुंजी आईडी को याद रखने की आवश्यकता है। अगली बार जब यह चलता है, तो वह उस आईडी के बाद सबकुछ सारांशित कर सकता है। हालांकि, अद्यतन किए गए/हटाए गए पुराने रिकॉर्ड का ट्रैक रखने के लिए, इसे एक और लॉग की आवश्यकता है ताकि वह वापस जा सके और उस डेटा को फिर से सारांशित कर सके।


मैं रणनीतियों, सुझाव या लिंक मदद कर सकते हैं किसी भी तरह का स्वागत करते हैं। धन्यवाद!

+0

सामग्री वाले विचार ऐसे विचार हैं जिन्हें अनुक्रमित किया जा सकता है (जिसे TSQL/SQL सर्वर शब्दावली में "अनुक्रमित दृश्य" कहा जाता है)। वे कुख्यात रूप से कार्यक्षमता में प्रतिबंधित हैं, और MySQL उन्हें समर्थन नहीं देता है। MySQL अन्य विक्रेताओं के साथ कार्यक्षमता की तुलना, गैर-भौतिक दृश्यों का समर्थन करता है। ओरेकल एकमात्र अन्य डीबी है जो मुझे पता है कि SQL सर्वर के अलावा, भौतिक दृश्यों का समर्थन करता है। मैं डीबी 2 करता हूं, लेकिन PostgreSQL नहीं करता है। –

उत्तर

2

जैसा कि ऊपर बताया गया है ओरेकल में भौतिक दृश्यों को SQL सर्वर में अनुक्रमित दृश्यों से अलग हैं। वे बहुत अच्छे और उपयोगी हैं।विवरण के लिए http://download.oracle.com/docs/cd/B10500_01/server.920/a96567/repmview.htm देखें

MySQL को इनके लिए समर्थन नहीं है।

एक बात जो आप कई बार उल्लेख करते हैं वह खराब प्रदर्शन है। क्या आपने उचित इंडेक्सिंग के लिए अपना डेटाबेस डिज़ाइन चेक किया है और यह देखने के लिए प्रश्नों पर योजनाओं की व्याख्या करें कि वे धीमे क्यों हैं। यहां देखें http://dev.mysql.com/doc/refman/5.1/en/using-explain.html। यह निश्चित रूप से यह मानते हुए है कि आपका सर्वर ठीक से ट्यून किया गया है, आपके पास MySQL सेटअप और ट्यून किया गया है, उदा। बफर कैश इत्यादि आदि

आपके सीधा प्रश्न के लिए। आप जो कुछ करना चाहते हैं वह वह है जो हम डेटा वेयरहाउस स्थिति में अक्सर करते हैं। हमारे पास एक उत्पादन डेटाबेस और एक डीडब्ल्यू है जो सभी प्रकार की जानकारी खींचता है, समेकित करता है और पूछताछ तेज करने के लिए इसे पूर्व-कैलकुलेट करता है। यह आपके लिए अधिक हो सकता है लेकिन आप तय कर सकते हैं। विलंबता के आधार पर आप अपनी रिपोर्ट के लिए परिभाषित करते हैं, यानी आपको कितनी बार उनकी आवश्यकता होती है, हम सामान्य रूप से उत्पादन प्रणाली से डीडब्लू को पॉप्युलेट करने के लिए समय-समय पर (दैनिक, साप्ताहिक, इत्यादि) एक ईटीएल (ट्रांसफॉर्म लोड निकालें) प्रक्रिया के माध्यम से जाते हैं। यह उत्पादन प्रणाली पर कम प्रभाव डालता है और सभी रिपोर्टिंग को सर्वर के दूसरे सेट पर ले जाता है जो भार को भी कम करता है। डीडब्ल्यू पक्ष पर, मैं आमतौर पर अपने स्कीमा को अलग-अलग डिजाइन करता हूं, यानी स्टार स्कीमा का उपयोग करता हूं। (http://www.orafaq.com/node/2286) स्टार स्कीमा में तथ्य सारणी (चीजें जिन्हें आप मापना चाहते हैं) और आयाम (चीजें जिन्हें आप उपायों को एकत्र करना चाहते हैं (समय, भूगोल, उत्पाद श्रेणियां इत्यादि) एसक्यूएल सर्वर में वे तथ्य सारणी और आयामों को देखने के लिए एसक्यूएल सर्वर विश्लेषण सेवाओं (एसएसएएस) नामक एक अतिरिक्त इंजन भी शामिल करते हैं, पूर्व गणना और ओलाप डेटा क्यूब्स का निर्माण करते हैं। इन डेटा क्यूब्स में आप ड्रिल कर सकते हैं और सभी प्रकार के पैटर्न देख सकते हैं, डेटा कर सकते हैं विश्लेषण और डेटा खनन। ओरेकल चीजों को थोड़ा अलग करता है लेकिन परिणाम वही है।

चाहे आप मार्ग के बारे में जाना चाहते हैं वास्तव में व्यापार की आवश्यकता पर निर्भर करता है और डेटा विश्लेषण से आपको कितना मूल्य मिलता है। जैसा कि मैंने कहा है संभावना है कि अगर आपके पास सिर्फ कुछ सारणी सारणी हैं लेकिन कुछ अवधारणाएं आपको उपयोगी लग सकती हैं क्योंकि आप चीजों को सोचते हैं। यदि आपका व्यवसाय एक व्यवसाय खुफिया सोल की ओर जा रहा है ution तो यह विचार करने के लिए कुछ है।

पीएस आप वास्तव में आरओएलएपी नामक कुछ का उपयोग कर "वास्तविक समय" में काम करने के लिए एक डीडब्ल्यू सेट कर सकते हैं यदि यह व्यवसाय की ज़रूरत है। Microstrategy एक अच्छा उत्पाद है जो इसके लिए अच्छा काम करता है।

पीपीएस आप एमएस (http://www.powerpivot.com/learn.aspx) से PowerPivot को भी देखना चाहते हैं, मैंने केवल इसके साथ खेला है, इसलिए मैं आपको यह नहीं बता सकता कि यह बहुत बड़े डेटासेट पर कैसे काम करता है।

3

फ्लेक्सव्यू (http://flexvie.ws) एक ओपन सोर्स PHP/MySQL आधारित प्रोजेक्ट है। फ्लेक्सव्यूज में माइक्रोसॉफ्ट, ओएनजीएच PHP और संग्रहीत प्रक्रियाओं में वृद्धिशील रीफ्रेशेबल भौतिक दृश्य (जैसे ओरेकल में भौतिक दृश्यों की तरह) जोड़ता है।

इसमें फ्लेक्ससीडीसी, एक PHP आधारित परिवर्तन डेटा कैप्चर यूटिलिटी शामिल है जो बाइनरी लॉग पढ़ता है, और फ्लेक्सव्यूज MySQL संग्रहीत प्रक्रियाओं का उपयोग करता है जिनका उपयोग विचारों को परिभाषित और बनाए रखने के लिए किया जाता है।

फ्लेक्सव्यूज़ जुड़ने (केवल आंतरिक जुड़ने) और एकत्रीकरण का समर्थन करता है ताकि इसका उपयोग सारणी सारणी बनाने के लिए किया जा सके। इसके अलावा, आप फॉलेक्सव्यूज़ का उपयोग मोंड्रियन (एक रोलएप सर्वर) एग्रीगेशन डिज़ाइनर के संयोजन में सारांश सारणी बनाने के लिए कर सकते हैं जो ROLAP टूल स्वचालित रूप से उपयोग कर सकते हैं।

यदि आपके पास लॉग तक पहुंच नहीं है (यह उन्हें दूरस्थ रूप से पढ़ सकता है, तो आपको सर्वर एक्सेस की आवश्यकता नहीं है, लेकिन आपको सुपर निजी की आवश्यकता है) तो आप फ्लेक्सव्यू के साथ 'पूर्ण' रीफ्रेश का उपयोग कर सकते हैं। यह एक नई तालिका नाम के तहत 'टेबल बनाएं ... AS SELECT' के साथ एक नई तालिका बना देता है। यह फिर एक के लिए नई तालिका को स्वैप करने के लिए RENAME तालिका का उपयोग करता है, पुराने को _old postfix के साथ नामित करता है। अंत में यह पुरानी मेज छोड़ देता है। यहां का लाभ यह है कि दृश्य बनाने के लिए एसक्यूएल डेटाबेस (flexviews.mview) में संग्रहीत है और इसे एक साधारण एपीआई कॉल के साथ रीफ्रेश किया जा सकता है जो स्वैपिंग प्रक्रिया को स्वचालित करता है।

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