Magento2'de mview nedir?


28

Her şeyden önce bildiklerimi:

Endeks yönetimi, mağaza performansını artırmak için yararlıdır.

EAV bir dezavantajı var.it veriyi farklı tablolara kaydeder. Böylece veri alımı zaman alır.

Böylece verileri tek bir tabloda saklayacağız. veri değiştiğinde bu tek tabloyu güncelleyeceğiz (dizin oluşturma güncellemesinden başka bir şey değil)

mysql trigger: Bir tablo ekleme / güncelleme / silme işlemine dayanarak bazı sorgulama eylemleri gerçekleştirin.

Bu nedenle, örneğin fiyat güncellenirken tetikleyici kullanan magento entity_id, değişiklik tablosunda depolanacaktır .

magento2'yi kullanan tetikleyicileri uygulamak için devdocs'ta bir ifade var Magento/Framework/Mview.

Bu fonksiyonelliğin akışını açıklayabilir misiniz?

i ne anlama view, action, processorvs?


2
Akıştan emin değil, ancak indeks tablolarının ne olduğu maddeleştirilmiş görünümleriMview ifade eder .
nevvermind

Yanıtlar:


55

Resmi belgelerde: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html stement var:

`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, belirli bir zamanda veritabanının anlık görüntüsü olan Materialized View anlamına gelir. https://en.wikipedia.org/wiki/Materialized_view Neden tabloları çoğaltmamız gerekiyor? Endeksleyiciler, özellikle kategori sayfalarında trafik olduğunda müşterilerin sipariş vermesi ve yöneticilerin ürünleri kurtarması için maliyetlidir. Ürüne kaydettiğiniz önbellek geçersiz hale gelir (konu dışı). Stok indeksleyicide, yürütmeyi bitirmeden önce, temizlenecek önbellek etiketleri olarak etkilenen varlık kimliklerini (tam sayfa önbellek türü) gönderir. Magento 2.0 kategorilerinde, satın alınan ürünlerin kimlikleri gönderilir. Magento 2.1'de ürün kimlikleri gönderilir.

Dizin oluşturucu kodlarını ve durumlarını tutan 2 MySQL tablosu vardır:

  • indexer_state
  • mview_state

mview_stateile çalışır Update by ScheduleYönetici> Sistem> Indexer Yönetiminde

Update by Schedule İndeksleyicilerin cron cinsinden çalıştırılmasını sağlar.

İçinde 3 giriş var 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çalıştırıldı indexer_state. Cron'da 'normal' indeksleyicileri çalıştırmaya hala ihtiyaç var
  • indexer_update_all_views çalıştırılır mview_state
  • indexer_clean_all_changelogs - tarafından kullanılan değişmezleri temizler mview_state

Beyan olarak cron dizin grup görevleri ayrı php işleminde çalıştırmanızı Not etc/contab_groups.xml: <use_separate_process>1</use_separate_process>.

Değişiklikler tabloları: [indexer name]_cl(ile sonlandırılmıştır _cl). örn cataloginventory_stock_cl. Update by ScheduleBir ürünü yönetici olarak ayarlayıp kaydettiğinizde indeksleyiciniz varsa entity_id, bu ürünün içindeki bu tabloyu göreceksiniz . Bu büyük bir çevre, bence yer emri veya gönderi oluştur buraya bir giriş ekleyecektir.

Birisi resmi devdoc'da yeni materyalize görüşler yaratmanın ve gerekli arayüz yöntemlerinin neler olduğuna dair bir örnek verdi (aşağıdaki kod parçasını aşağıdaki snippet'teki siparişlerle ilgili dikkate almayın):

<?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
}

Bu mantıklı olacaktır: //public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode } Nerede $idsparametrenin varlıklar kimlikleri *_cltablolardan.

Önbellek geçersiz kılma ve dizinleyiciler arasındaki bağlantı nedir. Kategoriler sayfaları artık tam sayfa önbelleğe alınmış (yerleşik tam sayfa önbelleği veya Cila ile).

Var \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]);
    }
}

Geri dön 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');
}

Gelen app/etc/di.xmlvardır:

<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" />

Gelen Magento\Framework\Mview\View::update()vardır:

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

İçinde arama yaparsanız vendor/için dizine Magento\Framework\Mview\ActionInterfaceörneğin bunun için bulabilirsiniz:

İçinde \Magento\CatalogInventory\Model\Indexer:

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

Bu sınıfta:

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

Ve MView tarafından kullanılan 'normal' dizin oluşturucu sınıfı 'execute` yöntemine geri dönüyor gibi gözüküyor.

Stok Endeksleyiciden sonra önbellek temizliği hakkında . Ödeme emri alındığında, bu gözlemci kullanılarak miktarlar çıkarılır:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver

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

Ayrıca, başka bir gözlemci indeksleyiciyi tetikler (ancak doğrudan Programa göre Mview / Indexer'da değil): \Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver

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

Mview durumunda, yeni miktarlar çıkarıldığında SubtractQuoteInventoryObserver, MySQL tetikleyicisi (Mview için yaratılmıştır) bir satır cataloginventory_stock_clekleyerek satın alınan ürün kimlikleri için bir reindex (stok ve tam metin) yapılması gerektiğini işaretler. Mview için oluşturulan birçok MySQL tetikleyicisi var. Hepsini gör SHOW TRIGGERS;.

Ödeme yapıldıktan sonra bir ürün stoktan çıktığında, bu tabloya 2 satır eklendiğini görürsünüz (Magento, bu 2 gözlemcide 2 kez stok kalemi kaydeder).

Cron, Mview modunda stok indeksleyiciyi çalıştırdığında, etkilenen ürün kimlikleri (M2.1'de) veya kategori kimlikleri (M2.0'da), önbellek etiketleri olarak temiz önbelleğe gönderilir. Önbellek ile tam sayfa önbellek türü demek istiyorum Örnek: catalog_product_99veya Magento versiyonuna bağlı olarak diğer önbellek etiketi formatı. Mview etkin olmadığında da aynı.

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

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

Ve Magento_PageCache, \Magento\PageCache\Observer\FlushCacheByTagstam sayfa önbellek türünü etiketlere göre temizleyecek bir gözlemciye sahiptir . Tam sayfa önbelleği oluşturmak için yapar. Vernikle ilgili kod var \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver.

Müşteri ödeme sonrasında hala stokta bulunan ürünlerde önbelleğin temizlenmesini engelleyen ücretsiz bir eklenti var:

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

Magento 2.2.x varsayılan olarak kullanıma sunulduktan sonra yalnızca stoktaki ürünlerde önbellek temizliği. Bakın \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner.

İndeksleyici için cron uygulamasının Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index1 dakikadan daha fazla ayarlanması gerektiğini düşünüyorum.


6

mview.xmlİle birlikte kullanılır indexer.xmlkurulum Dizinleyicilere.

mview.xmlDosya bildiriyor:

  • dizinleyici görünüm kimliği
  • indeksleyici sınıfı
  • veritabanı indeksleyicinin izlediği tabloları gösterir.
  • hangi sütun verilerinin indeksleyiciye gönderildiği

indexer.xmlDosya bildiriyor:

  • dizin oluşturucu kimliği
  • dizinleyici sınıf adı
  • dizinleyici başlığı
  • indeksleyici açıklaması
  • dizinleyici görünüm kimliği

Özel dizin oluşturucu bildirimi hakkında daha fazla bilgiyi burada bulabilirsiniz: Magento2'deki Özel dizin oluşturucu

Anladığım kadarıyla, burada iki farklı şey var:

  • Magento_IndexerModülden gelen indeksleyici
  • Magento\Framework\MviewTetikleyicileri kullanarak MySQL için somutlaştırılmış görünümü taklit eden Mview .

İşte resmi belgelerden bazı ayrıntılı bilgiler.

İndeksleme türleri

Her bir dizin aşağıdaki reindex işlemlerini gerçekleştirebilir:

  • Dizin oluşturmaya ilişkin tüm veritabanı tablolarını yeniden oluşturmak anlamına gelen tam reindex.

  • Tam olarak yeniden boyutlandırma, yeni bir web mağazası veya yeni bir müşteri grubu oluşturmak da dahil olmak üzere çeşitli şeylerden kaynaklanabilir. İsteğe bağlı olarak komut satırını kullanarak istediğiniz zaman tamamen reindex yapabilirsiniz.

  • Kısmi reindex, veritabanı tablolarını yalnızca değişen şeyler için yeniden inşa etmek anlamına gelir (örneğin, tek bir ürün özelliğini veya fiyatını değiştirmek).

Her özel durumda gerçekleştirilen reindex türü, sözlükte veya sistemde yapılan değişikliklerin türüne bağlıdır. Bu bağımlılık her indeksleyiciye özgüdür.

İş Akışı ile ilgili olarak, burada kısmi reindexing için:

görüntü tanımını buraya girin



6

Magento belgesinden referans zaten burada, bu yüzden bu bölümü atlıyorum.
Magento, tüm indeksleyicilerin değişikliklerini izleyen 2.0'da materyalize bir görünüm uyguladı. Her dizin bir sahiptir _clalır tablo entity_idve bir auto_increment version_idTetikleyiciler Ana Tablo ilave edildi.
Cron işi yürütüldüğünde, dizinleyici tablodaki version_idher görünüm için en son ve mview_statetablodaki sonraki kullanılabilir öğeleri dizine alır _cl.
Yeniden indeksleme 1.9.xx'e kadar baş ağrısıydı ve büyük katalog sayesinde sistemi daima yavaşlatıyor.
Magento 2.0 indeksleyicide, tüm verileri yeniden indekslemek yerine sadece indeks tablolarındaki belirli varlık bilgilerini güncelleyin. Bu, sunucuyu yavaşlatmadan topu yuvarlamayı sağlar.
Not: Materialized View, mysql'de desteklenmez, bu nedenle Magento'da, PHP kodu ile yönetilir ve oracle gibi işletme düzeyinde DBMS'deki bir özellik olan Materialized görünümüne benzer şekilde çalışır.


"Magento 2.0'da materyalize bir görünüm uyguladı" - aslında Magento 1 EE'de bir süredir var
Robbie Averill

"Magento 2.0 dizinleyicide, tüm verileri yeniden boyutlandırma yerine yalnızca dizin bilgileri tablolarındaki belirli varlık bilgilerini günceller." - yine, Magento 1'de de kısmi reindexing var
Robbie Averill

Yalnızca topluluk yayınlarına dayanarak açıklamalar yaptım.
Aman Srivastava
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.