चूंकि अन्य लोगों ने पहले ही आपके सवालों के जवाब दिए हैं। मैंने सोचा कि यह समझाने के लिए बेहतर हो सकता है कि अनुक्रमण की आवश्यकता क्यों है और यह मैगेंटो और आधुनिक डेटाबेस के संबंध से कैसे संबंधित है ।
सूचकांक: नाम, विषयों आदि की एक वर्णमाला सूची, उन स्थानों के संदर्भ में जहां वे होते हैं, आमतौर पर एक पुस्तक के अंत में पाया जाता है।
तो डेटाबेस के संदर्भ में वास्तव में एक सूचकांक क्या है ?
एक सूचकांक एक डेटा संरचना है जो एक या एक से अधिक क्षेत्रों पर कई रिकॉर्ड बनाती है, और डेटा पुनर्प्राप्ति को गति देती है। यह डिस्क ब्लॉक के माध्यम से स्कैनिंग से बचने के लिए है जो डेटाबेस के माध्यम से खोजते समय एक टेबल स्पैन करता है।
और Magento के संदर्भ में अनुक्रमण क्या है ? एक डेटाबेस के भीतर एक डेटाबेस EAV (इकाई गुण मान) AKA के उप-उत्पाद। कई लुकअप टेबलों के साथ, सभी विशेषताओं को एकत्रित करते हुए चिह्नित किया गया है, ताकि तेजी से प्रश्नों और कम I / O, और CPU चक्रों के लिए सभी लुकअप तालिकाओं के एक समतल तालिका में संयोजित किया जा सके।
मुझे एक उल्लेख याद है कि जब मैगेंटो को शुरू में विकसित किया जा रहा था, तो प्राथमिकता सूची में लचीलापन अधिक था, जो समझ में आता है कि उन्होंने ईएवी डेटा मॉडल के साथ जाना क्यों चुना। अंततः हालांकि इस तरह के लचीलेपन के लिए लागत प्रदर्शन के लिए लागत पर आई और इसने शुरू से ही मैगेंटो को त्रस्त कर दिया है।
सामान्य तौर पर, मैगेंटो इंजीनियर्स को सबसे लचीला, अनुकूलन योग्य सिस्टम बनाने और बाद में प्रदर्शन के बारे में चिंता करने के साथ, सबसे पहले और सबसे महत्वपूर्ण काम सौंपा गया था। Magento इतना धीमा क्यों है?
ईएवी डेटा वेयरहाउसिंग के लिए महान है लेकिन लेनदेन के लिए भयानक है। तो हमें शुरुआत करने के लिए अनुक्रमित की आवश्यकता क्यों है? चूंकि रिलेशनल मॉडल के समान दृष्टिकोण को फिर से लागू किया गया है, इसलिए Magento को अब उन सभी चीजों को संभालना है जो MySQL आंतरिक रूप से खुद करता है। कुछ चीजों पर विचार करना, जैसे कि इंडेक्स पहले से ही MySQL टेबल में मौजूद है। इसे भी ध्यान में रखते हुए, EAV डेटा मॉडल पर अभी विचार करें:
- ई ntity = तालिका
- एक श्रद्धांजलि = क्षेत्र
- V alue = मान
उसी को फिर से लागू किया जाना चाहिए, जो बहुत "विरोधी पैटर्न" आईएमओ है।
साथ ही, यह वही कारण है var/locksजो आप पाते हैं कि अनुक्रमणिका अनुक्रमण प्रक्रिया को लॉक करने के लिए किसका उपयोग करती है । समान कारणों से डेटाबेस में पंक्ति / तालिका लॉकिंग होती है।
अब जब कोई रिकॉर्ड होता है, तो मान लें कि उत्पाद का मूल्य बदल दिया गया है flat tableया index(जैसे कि MySQL इसे किस रूप में संदर्भित करेगा) को नए बदले गए डेटा पर प्रश्नों के लिए प्रतिबिंबित होने के लिए अपडेट किया जाना है और कई रिकॉर्डों के माध्यम से स्कैन किए बिना कुशलता से पाया जा सकता है। फ्लैट टेबल मौजूद हैं क्योंकि यह बहुत ही कारण में इस्तेमाल किया गया था MySQL उन्हें है, इस तरह के सूचकांक (एक किताब की तरह) के बिना इसे रिकॉर्ड प्राप्त करने के लिए एक पूर्ण टेबल स्कैन की आवश्यकता होती है। यह डिस्क और मेमोरी दोनों के साथ-साथ सीपीयू चक्रों के लिए अनुरोध किए गए डेटा का पता लगाने के लिए बड़े पैमाने पर I / O का अर्थ है, जो प्रदर्शन के लिए बहुत खराब है।
चूंकि मैगेंटो ईएवी डेटा मॉडल का उपयोग करता है, इसलिए कई लुकअप टेबल हैं जिन्हें अनुरोध किए गए डेटा का पता लगाने के लिए सभी डेटा को एक साथ स्कैन करने के लिए स्कैन करना होगा। यदि आप फ्लैट कैटलॉग को अक्षम करते हैं तो यही होता है। MySQL की तरह, कीमती I / O चक्रों के संरक्षण के दौरान रिकॉर्ड का पता लगाने के लिए एक इंडेक्स (फ्लैट टेबल) का उपयोग करके रिकॉर्ड बनाम स्कैन करने के लिए उपयोग किया जा सकता है। मेज बनाना और किसी भी इंडेक्स को नहीं जोड़ना वैसा ही है जैसा कि मैग्नेटो में फ्लैट टेबल का उपयोग नहीं करना। हालांकि ये दो परिदृश्य विभिन्न परिदृश्यों में अच्छी तरह से काम कर सकते हैं, इस सवाल का जवाब सोनासी के बेन में देखें । (संकेत में डेटा के दायरे को समझना शामिल है।)
हालांकि, यह आपके प्रश्न का सीधा जवाब नहीं है, चलती भागों को समझना और उनके लिए बेहतर रूप से तैयार होना कुछ ऐसे सिरदर्द को कम करने में मदद करना चाहिए जो अनुक्रमण के साथ आते हैं। " लक्षण के बजाय समस्या का इलाज करें। "
आधुनिक डेटाबेस सिस्टम के इंटर्नल्स में अधिक खोज करना बेहतर समझ के साथ मदद कर सकता है कि कैसे और क्यों इंडेक्सिंग आवश्यक है और कैसे यह (कुछ) मैगेंटो के इंडेक्सिंग से भी संबंधित है।
संक्षेप में: समाधान लागू करने से पहले अपनी समस्या को समझें। जैसा कि डेटा का प्रत्येक बिट बिल्कुल वैसा ही नहीं होगा और योजना के कार्यान्वयन और समाधान को लागू करने के बाद आपको समस्या की अच्छी / पूरी समझ मिल जाएगी। डेटाबेस अनुकूलन परिवर्तन प्रबंधन के लिए बहुत फायदेमंद हो सकता है। जैसे कि खूंखार को रोकना DEADLOCKS।
आप अपने सभी इंडेक्सर्स को Manualसेट-ऑफ टाइम पीक टाइम (जब एड्मिन दूर होते हैं) पर इंडेक्स को फिर से बनाने के लिए वैकल्पिक इंडेक्स की स्थापना पर विचार करना चाहते हैं। केवल Product Pricesऔर Stock Statusसेट होना चाहिए Update on Save।
अब विचार करें कि तकनीकी दृष्टि से अनुक्रमण कैसे काम करता है। मुख्य मॉड्यूल अनुक्रमण के लिए जिम्मेदार है Mage_Index। इंडेक्सर के बुनियादी मॉडल: Indexer, Process, Event।
Mage_Index_Model_Indexerअनुक्रमणिका है, अन्य मॉड्यूल के साथ सभी इंटरैक्शन Mage_Indexइस सेवा के माध्यम से होते हैं। इसमें निम्नलिखित विधियाँ शामिल हैं:
processEntityAction() ईवेंट बनाता और पंजीकृत करता है और अनुक्रमण प्रक्रिया शुरू करता है
logEvent() एक घटना बनाता है और बाद के अनुक्रमण के लिए इसे पंजीकृत करता है;
indexEvent() अनुक्रमण घटनाओं को चलाता है;
getProcessesCollection()आम तौर पर सार बदलने के बाद सभी प्रक्रियाओं जैसे उत्पाद गुण, उत्पाद की कीमतें, कैटलॉग यूआरएल रिवाइराइट्स आदि का संग्रह लौटाता है, जैसे कि विधि _afterSaveया _afterCommitहम आंशिक पुन: सूचकांक करते हैं।
Mage_Index_Model_Processया प्रक्रिया अपने इंडेक्सर का सार है कि दुकानों की स्थिति, पिछले रन आपरेशन। सभी प्रक्रियाओं को तालिका में संग्रहीत किया जाता है index_process। कार्यक्रम में एक विधि है getIndexer()जो मॉडल के सूचकांक को वापस करती है। इंडेक्स मॉडल की प्रक्रिया द्वारा अधिकांश कार्य सौंपे गए हैं।
Mage_Index_Model_Eventहोने वाली घटना के बारे में जानकारी संग्रहीत करता है। उदाहरण के लिए, हम उत्पाद को संग्रहीत करते हैं और सहेजने के बाद, हम एक नया ईवेंट बनाते हैं और इस बारे में जानकारी संग्रहीत करते हैं कि हमने किस प्रकार की इकाई को बचाया है कि किस आईडी में आत्मा है और इस पदार्थ के लिए हमने क्या कार्रवाई की है।
अमान्य होने की एक सामान्य सूची:
- कैटलॉग / उत्पाद (बचाओ, DELETE, MASS_ACTION)
- सूची / श्रेणी (बचाओ, DELETE)
- कैटलॉग / रिसोर्स_एवी_टैब (सेव, DELETE)
- ग्राहक / समूह (बचाओ)
- कैटलॉगवेंट्री / स्टॉक_इटेम (बचाओ)
- टैग / टैग (बचाओ)
- कोर / स्टोर (बचाओ, DELETE)
- कोर / store_group (बचाओ, DELETE)
- कोर / वेबसाइट (SAVE, DELETE)
config.xmlलेन-देन की बचत पर मॉड्यूल में पंजीकृत सूचकांक के साथ कोई भी संसाधन मॉडल । afterCommitCallback()एक उपसर्ग के साथ कहा जाता है। यह वह जगह है जहां सूचकांक घटनाओं को लॉग किया जाता है, क्योंकि यह एक सफल लेनदेन के अंत में है।
... और यह मुझे दुखी करता है कि EAV अभी भी Magento 2 में है। :(
संदर्भ: