Magento2 में mview क्या है?


28

सबसे पहले मैं क्या जानता हूँ:

सूचकांक प्रबंधन स्टोर प्रदर्शन को बढ़ाने के लिए उपयोगी है।

EAV इसमें एक नुकसान है। यह डेटा को अलग-अलग तालिकाओं में संग्रहीत करेगा। डेटा प्राप्त करने में समय लगता है।

ताकि हम डेटा को सिंगल टेबल में स्टोर करेंगे। जब डेटा बदला जाता है तो हम इस सिंगल टेबल को अपडेट करेंगे (अपडेट के अलावा कुछ भी नहीं)

mysql trigger: कुछ टेबल डालने / अपडेट / डिलीट करने के आधार पर कुछ क्वेरी क्रियाएं करें।

जब मूल्य अद्यतन कर रहा है तो उदाहरण के लिए ट्रिगर का उपयोग करते हुए Magento यह entity_idचैंज टेबल में संग्रहीत करेगा ।

उपयोग करने वाले ट्रिगर्स मैगेंटो 2 को लागू करने के लिए देवदास में एक कथन है Magento/Framework/Mview

क्या आप किसी को इस कार्यक्षमता के प्रवाह की व्याख्या कर सकते हैं।

मेरा मतलब है view, क्या है action, processorआदि?


2
प्रवाह के बारे में निश्चित नहीं है, लेकिन भौतिकवादी विचारोंMview को संदर्भित करता है , जो कि सूचकांक तालिकाएं हैं।
नेवरमाइंड

जवाबों:


55

आधिकारिक दस्तावेज़ीकरण में: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html वहाँ कदम है:

`Allows tracking database changes for a certain entity (product, category and so on) and running change handler.
Emulates the materialized view technology for MySQL using triggers and separate materialization process (provides executing PHP code instead of SQL queries, which allows materializing multiple queries).`

MView का मतलब है Materialized View जो कि एक बिंदु पर डेटाबेस का एक स्नैपशॉट है। https://en.wikipedia.org/wiki/Materialized_view हमें तालिकाओं को डुप्लिकेट करने की आवश्यकता क्यों होगी। इंडेक्सर्स को चलाना महंगा पड़ता है, खासकर जब श्रेणी के पन्नों पर ट्रैफिक होता है, तो ग्राहक ऑर्डर देते हैं और उत्पादों को बचाते हैं। उत्पाद को सहेजने पर कैश अमान्य (ऑफ विषय) हो जाता है। स्टॉक इंडेक्सर के मामले में, निष्पादन समाप्त होने से पहले, यह कैश आईडी के रूप में प्रभावित इकाई आईडी को साफ करने के लिए भेजता है (पूर्ण पृष्ठ कैश कार्ड)। Magento 2.0 श्रेणियों में खरीदे गए उत्पादों के आईडी भेजे जाते हैं। Magento 2.1 में उत्पाद आईडी भेजे जाते हैं।

2 MySQL टेबल हैं जो इंडेक्स कोड और स्टेटस रखते हैं:

  • indexer_state
  • mview_state

mview_stateUpdate by Scheduleव्यवस्थापक> प्रणाली> अनुक्रमणिका प्रबंधन के साथ काम करता है

Update by Schedule इंडेक्स को क्रोन में चलाया जाता है।

इसमें 3 प्रविष्टियाँ हैं Magento_Indexer/etc/contab.xml:

<group id="index">
    <job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Cron\ReindexAllInvalid" method="execute">
        <schedule>* * * * *</schedule>
    </job>
    <job name="indexer_update_all_views" instance="Magento\Indexer\Cron\UpdateMview" method="execute">
        <schedule>* * * * *</schedule>
    </job>
    <job name="indexer_clean_all_changelogs" instance="Magento\Indexer\Cron\ClearChangelog" method="execute">
        <schedule>0 * * * *</schedule>
    </job>
</group>
  • indexer_reindex_all_invalidपर चलाया जाता है indexer_state। क्रोन में अभी भी 'सामान्य' सूचकांक चलाने की आवश्यकता है
  • indexer_update_all_views पर चलाया जाता है mview_state
  • indexer_clean_all_changelogs - उपयोग किए गए चेंजलॉग्स को साफ करता है mview_state

ध्यान दें कि क्रॉन इंडेक्सर ग्रुप टास्क, के रूप में घोषित किये गए एक अलग php प्रक्रिया में चलाने etc/contab_groups.xml: <use_separate_process>1</use_separate_process>

चांगेलॉग टेबल हैं: [indexer name]_cl(के साथ प्रत्यय _cl)। उदा cataloginventory_stock_cl। यदि आपके पास Update by Scheduleकिसी उत्पाद को इंडेक्स में सेट करने और सहेजने के लिए है, तो आप entity_idइस तालिका में उस उत्पाद के देखेंगे । यह एक बड़ा चक्र है, मैं सोच रहा हूं कि जगह ऑर्डर करें या शिपमेंट बनाएं यहां एक प्रविष्टि भी जुड़ जाएगी।

किसी ने नए भौतिक विचारों को बनाने के तरीके पर आधिकारिक डिडॉक में एक उदाहरण प्रदान किया और इंटरफ़ेस के तरीकों की आवश्यकता क्या है (स्निपेट बलो में आदेशों के बारे में उपरोक्त कथन की उपेक्षा):

<?php
<VendorName>\Merchandizing\Model\Indexer;
class Popular implements \Magento\Framework\Indexer\ActionInterface,   \Magento\Framework\Mview\ActionInterface
{
public function executeFull(); //Should take into account all placed orders in the system
public function executeList($ids); //Works with a set of placed orders (mass actions and so on)
public function executeRow($id); //Works in runtime for a single order using plugins
public function execute($ids); //Used by mview, allows you to process multiple placed orders in the "Update on schedule" mode
}

यह समझ में आएगा: //public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode } जहां $idsपैरामीटर में *_clतालिकाओं से आईडी आईडी हैं ।

कैश अमान्यकरण और सूचकांक के बीच की कड़ी क्या है। श्रेणियाँ पृष्ठ अब पूर्ण पृष्ठ कैश किए गए हैं (अंतर्निहित पूर्ण पृष्ठ कैश या वार्निश के माध्यम से)।

वहाँ है \Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview:

/**
 * Update indexer views
 *
 * @param \Magento\Indexer\Model\Processor $subject
 * @return void
 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 */
public function afterUpdateMview(\Magento\Indexer\Model\Processor $subject)
{
    if ($this->moduleManager->isEnabled('Magento_PageCache')) {
        $this->eventManager->dispatch('clean_cache_after_reindex', ['object' => $this->context]);
    }
}

पर वापस Magento\Indexer\Cron\UpdateMview::execute():

/**
 * Regenerate indexes for all invalid indexers
 *
 * @return void
 */
public function execute()
{
    $this->processor->updateMview();
}

Magento\Indexer\Model\Processor::updateMview():

/**
 * Update indexer views
 *
 * @return void
 */
public function updateMview()
{
    $this->mviewProcessor->update('indexer');
}

इसमें app/etc/di.xmlहै:

<preference for="Magento\Framework\Mview\ProcessorInterface" type="Magento\Framework\Mview\Processor" />


/**
 * Materialize all views by group (all views if empty)
 *
 * @param string $group
 * @return void
 */
public function update($group = '')
{
    foreach ($this->getViewsByGroup($group) as $view) {
        $view->update();
    }
}

Magento\Framework\Mview\ViewInterface

/**
 * Materialize view by IDs in changelog
 *
 * @return void
 * @throws \Exception
 */
public function update();

app/etc/di.xml

 <preference for="Magento\Framework\Mview\ViewInterface" type="Magento\Framework\Mview\View" />

इसमें Magento\Framework\Mview\View::update()है:

$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..

यदि आप vendor/निर्देशिका में खोज करते हैं Magento\Framework\Mview\ActionInterfaceतो आपको इसका उदाहरण मिलेगा:

इन \Magento\CatalogInventory\Model\Indexer:

class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface

इस वर्ग में है:

/**
 * Execute materialization on ids entities
 *
 * @param int[] $ids
 *
 * @return void
 */
public function execute($ids)
{
    $this->_productStockIndexerRows->execute($ids);
}

और ऐसा लग रहा है कि यह वापस 'सामान्य' वर्ग के इंडेक्सर्स 'निष्पादित' विधि का उपयोग करता है जो कि MView द्वारा उपयोग किया जाता है।

स्टॉक इंडेक्सर के बाद कैश सफाई के बारे में । जब एक आदेश चेकआउट पर रखा जाता है, तो इस पर्यवेक्षक का उपयोग करके मात्राएँ घटा दी जाती हैं:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver

$itemsForReindex = $this->stockManagement->registerProductsSale(
    $items,
    $quote->getStore()->getWebsiteId()
);

इसके अलावा, एक और प्रेक्षक अनुक्रमणिका चलाता है (लेकिन सीधे Mview / अनुक्रमक पर अनुसूची द्वारा नहीं): \Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver

if ($productIds) {
    $this->stockIndexerProcessor->reindexList($productIds);
}

Mview के मामले में, जब नई मात्रा को घटाया जाता है SubtractQuoteInventoryObserver, तो MySQL ट्रिगर (Mview के लिए बनाई गई) में एक पंक्ति सम्मिलित होगी cataloginventory_stock_cl, जो यह चिन्हित करेगी कि उन खरीदी गई उत्पाद आईडी के लिए एक reindex (स्टॉक और फुलटेक्स्ट) की आवश्यकता है। Mview के लिए कई MySQL ट्रिगर बनाए गए हैं। उन सभी के साथ देखें SHOW TRIGGERS;

जब चेकआउट के बाद कोई उत्पाद स्टॉक से बाहर हो जाता है, तो आपको उस तालिका में 2 पंक्तियाँ दिखाई देंगी (Magento इन 2 वेधशालाओं में 2 गुना स्टॉक आइटम बचाता है)।

जब क्रोन Mview मोड में स्टॉक इंडेक्सर चलाता है तो प्रभावित उत्पाद आईडी (M2.1 में) या श्रेणियां आईडी (M2.0 में) कैश टैग के रूप में साफ करने के लिए भेजे जाते हैं। कैशे द्वारा मेरा मतलब है फुल पेज कैश टाइप। उदाहरण: catalog_product_99या Magento के संस्करण के आधार पर अन्य कैश टैग प्रारूप। वही जब Mview सक्षम नहीं है।

\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows

...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);

और Magento_PageCache में पर्यवेक्षक हैं \Magento\PageCache\Observer\FlushCacheByTagsजो टैग द्वारा पूर्ण पृष्ठ कैश प्रकार को साफ करेंगे। यह बिल्ट-इन फुल पेज कैश के लिए करता है। वार्निश संबंधित कोड में है \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver

एक मुफ्त एक्सटेंशन है जो ग्राहक के चेकआउट के बाद भी स्टॉक उत्पादों में कैश को साफ करने से इनकार करेगा:

https://github.com/daniel-ifrim/innovo-cache-improve

डिफ़ॉल्ट रूप से Magento 2.2.x में चेकआउट की शुरुआत के बाद केवल स्टॉक उत्पादों में से कैशे की सफाई। देख लो \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner

मुझे लगता है कि इंडेक्सर के लिए क्रॉन निष्पादन Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index1 मिनट से अधिक समय के लिए सेट होना चाहिए।


6

इसका mview.xmlउपयोग indexer.xmlसेटअप इंडेक्सरों के साथ किया जाता है ।

mview.xmlफ़ाइल वाणी:

  • अनुक्रमणिका देखें आईडी
  • सूचकांक वर्ग
  • डेटाबेस अनुक्रमणिका पटरियों की तालिका
  • क्या स्तंभ डेटा अनुक्रमणिका को भेजा जाता है

indexer.xmlफ़ाइल वाणी:

  • सूचकांक आईडी
  • अनुक्रमक वर्ग का नाम
  • अनुक्रमणिका शीर्षक
  • अनुक्रमणिका विवरण
  • अनुक्रमणिका देखें आईडी

आप यहाँ कस्टम इंडेक्सर घोषणा के बारे में अधिक जानकारी प्राप्त कर सकते हैं: Magento2 पर कस्टम इंडेक्सर

जो मुझे समझ में आया, उससे दो भिन्न बातें यहाँ हैं:

  • Magento_Indexerमॉड्यूल से अनुक्रमणिका
  • वह Mview Magento\Framework\Mviewजिसमें ट्रिगर्स का उपयोग करके MySQL के लिए भौतिकीकृत दृश्य का अनुकरण किया जाता है।

यहां आधिकारिक दस्तावेज से कुछ प्रबुद्ध जानकारी दी गई है

अनुक्रमण प्रकार

प्रत्येक अनुक्रमणिका निम्न प्रकार के reindex संचालन कर सकती है:

  • पूर्ण रीइंडेक्स, जिसका अर्थ है सभी अनुक्रमण से संबंधित डेटाबेस तालिकाओं का पुनर्निर्माण करना।

  • एक नया वेब स्टोर या नया ग्राहक समूह बनाने सहित विभिन्न चीजों के कारण पूर्ण रीइंडेक्सिंग हो सकता है। आप वैकल्पिक रूप से कमांड लाइन का उपयोग करके किसी भी समय पूरी तरह से रेनडेक्स कर सकते हैं।

  • आंशिक रेनडेक्स, जिसका अर्थ है कि केवल बदल गई चीजों के लिए डेटाबेस तालिकाओं का पुनर्निर्माण करना (उदाहरण के लिए, एकल उत्पाद विशेषता या मूल्य बदलना)।

प्रत्येक विशेष मामले में किया गया रेनडेक्स का प्रकार शब्दकोश या सिस्टम में किए गए परिवर्तनों के प्रकार पर निर्भर करता है। यह निर्भरता प्रत्येक सूचकांक के लिए विशिष्ट है।

वर्कफ़्लो के बारे में, यहाँ यह आंशिक रीइन्डेक्सिंग के लिए है:

यहाँ छवि विवरण दर्ज करें


1
प्रलेखन में एक बग है। github.com/magento/magento2/issues/4658
शिवकुमार के

6

Magento दस्तावेज़ से संदर्भ पहले से ही है इसलिए मैं उस भाग को छोड़ रहा हूँ।
मैगेंटो ने 2.0 में भौतिक दृष्टिकोण को लागू किया जो सभी इंडेक्सर्स के लिए परिवर्तन को ट्रैक करता है। प्रत्येक अनुक्रमणिका में एक _clटेबल होती है जो मुख्य टेबल पर जोड़े गए ट्रिगर्स से entity_idऔर auto_increment version_idप्राप्त होती है।
जब क्रॉन जॉब निष्पादित होता है, तो इंडेक्स टेबल version_idसे प्रत्येक दृश्य के लिए अंतिम हो जाता है mview_stateऔर तालिका में अगले उपलब्ध संस्थाओं को इंडेक्स करता है _cl
Reindexing 1.9.xx तक एक सिरदर्द था और विशाल कैटलॉग के साथ यह हमेशा सिस्टम को धीमा कर देता था।
मैगेंटो 2.0 इंडेक्सर में केवल पूरे डेटा को रिवाइंड करने के बजाय इंडेक्स टेबल्स पर विशेष इकाई जानकारी को अपडेट किया जाता है। यह सर्वर को धीमा किए बिना गेंद को घुमाता रहता है।
नोट: मैगेंटो में मटेरियल व्यू का समर्थन नहीं किया गया है, इसलिए इसे PHP कोड द्वारा प्रबंधित किया जाता है और यह Materialized व्यू के समान काम करता है जो कि ओरेकल जैसे एंटरप्राइज़ स्तर DBMS में एक विशेषता है।


"मैगेंटो ने 2.0 में भौतिकवादी दृष्टिकोण को लागू किया" - वास्तव में यह कुछ समय के लिए मैगनेटो 1 ईई में रहा है
रॉबी एवरिल

"मैगेंटो 2.0 इंडेक्सर में केवल पूरे डेटा को रिवाइंड करने के बजाय इंडेक्स टेबल्स पर विशेष इकाई जानकारी को अपडेट किया जाता है।" - फिर से, मैगेंटो 1 में भी आंशिक रूप से रेनडेक्सिंग मौजूद है
रोबी एवरिल

मैंने केवल सामुदायिक संस्करणों के आधार पर वक्तव्य दिए।
अमन श्रीवास्तव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.