Endeksler ne zaman geçersizdir?


23

Bir dükkanım var ve her zaman TÜM dizinler geçersiz. Bir endeks geçersiz olduğu zaman hiçbir fikrim olmadığını fark ettim.

Bana bu indekslerden birini veya daha fazlasını geçersiz hale getiren "tüm" olayların bir listesini verebilir misiniz?

  • Ürün özellikleri
  • Ürün fiyatları
  • Katalog URL'si Yeniden Yazılıyor
  • Ürün Düz Veri
  • Kategori Ürünleri
  • Katalog Arama Dizini
  • Etiket Toplama Verileri
  • Stok durumu

Yanıtlar:


18

Kod dizininde bir grep yapmak size bir geçersiz kılmayı tetikleyen dosyaların bir listesini verecektir. grep -Ri '::STATUS_REQUIRE_REINDEX' .

Aşağıdaki çekirdek dosyalar geçersiz kılmayı tetikliyor

./core/Mage/CatalogSearch/Model/Indexer/Fulltext.php
./core/Mage/Catalog/Model/Product/Indexer/Flat.php
./core/Mage/Catalog/Model/Product/Indexer/Price.php
./core/Mage/Catalog/Model/Category/Indexer/Flat.php
./core/Mage/Catalog/Model/Category/Indexer/Product.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Category/Flat.php
./core/Mage/Catalog/Model/Indexer/Url.php
./core/Mage/Backup/Helper/Data.php
./core/Mage/CatalogInventory/Model/Indexer/Stock.php
./core/Mage/ImportExport/Model/Import.php

Magento CE çekirdeğindeki temel olaylar

Ürün özellikleri

özel katalog özelliği (düz ürünün bir parçası), mağaza, düz katalog ürünü etkinse store_group

Ürün fiyatları

konfigürasyon ayarlarının kontrolü (fiyat kapsamı gibi) kontrol edilir. veya ürün kaydetme, web sitesi oluşturma / silme

Katalog URL'si Yeniden Yazılıyor

spesifik bir geçersiz kılma yok

Ürün Düz Veri

Spesifik kaydetme özelliği (yassı ürünün bir parçasıdır), yassı katalog ürünü etkinleştirilmişse, Yassı ürün etkinleştirildikten sonra

Kategori Daire Verileri

Kontrol düz katalog kategorisi etkin ve özel kaydetme kategorisidir, Düz kategoriyi etkinleştirdikten sonra

Kategori Ürünleri

kontrol düz katalog kategorisi etkin ve özel kaydetme kategorisidir.

Katalog Arama Dizini

özel katalog özelliği (aranabilir özelliklerin bir parçası), düz katalog ürünü etkin ise store, store_group

Etiket Toplama Verileri

Aşağıda belirtilen genel koşullar dışında asla geçersiz sayılmaz

Stok durumu

özel Sistem> Envanter sekmesindeki ayarları yapılandırın, örneğin stokta bulunan ürünleri gösterin

Hepsi System > Tools > Backupweb sitesinden, mağazalardan ve depolardan gelen bir yedekleme ve oluşturma, silme veya gezinme işleminin geri alınmasından sonra geçersiz sayılır. Ürün için veri akışı içe aktarma işlemlerini çalıştırdıktan sonra, aşağıdakiler geçersiz kılınır: catalog_product_price, catalog_category_product, catalogsearch_fulltext, catalog_product_flat

Düz veri ve URL dizin oluşturucu gibi bazı dizinleyiciler de core_config_datadeğerleri kaydederek geçersiz görünüyor .


14

Belki de bu site için geçici olarak yeniden yazmak için bir fikir

Mage_Index_Model_Resource_Process

O zaman şöyle bir şey yap:

<?php

class YourNamespace_YourModule_Model_Resource_Process
    extends Mage_Index_Model_Resource_Process
{

    public function updateStatus($process, $status)
    {
        if ($status === Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX) {
            Mage::log(sprintf('Indexer %s was invalidated.', $process->getIndexer()->getName()), null, 'invalid_index.log', true);
            foreach (debug_backtrace() as $db) {
                Mage::log(sprintf('%s::%s', $db['class'], $db['function']), null, 'invalid_index.log', true);
            }
        }
        return parent::updateStatus($process, $status);
    }

}

Bir indeksleyicinin geçersiz hale gelmesi ve bundan sorumlu olan çağrı takibi durumunun kolayca tespit edilmesi gerekir.


10

Çünkü diğerleri zaten sorularınızı cevapladılar. İndekslemeye neden ihtiyaç duyulduğunu ve bunun Magento ve modern veritabanları ile ilişkisinin nasıl olduğunu açıklamanın daha iyi olacağını düşündüm .

Dizin: genellikle bir kitabın sonunda bulunan, oluştukları yerlere referansla alfabetik bir ad, konu vb. Listesi.

Peki tam anlamında bir İndeksi nedir Veritabanları ?

Dizin, bir veya daha fazla alanda bir dizi kaydı sıralayan ve veri alımını hızlandıran bir veri yapısıdır. Bu, veritabanında arama yaparken bir tablonun yaydığı disk bloklarını taramaktan kaçınmak içindir.

Magento açısından hangi İndeksleme nedir? EAV (Varlık Öznitelik Değeri) AKA'nın yan ürünü bir veritabanı içindeki veritabanı. Birden fazla arama tablosuyla, daha hızlı sorgular ve daha az G / Ç ve CPU döngüleri için, tüm arama tablolarının düz bir tablosunda birleştirilmek üzere dizine eklenerek işaretlenen tüm öznitelikleri toplamak.

Magento ilk olarak geliştirilirken öncelik listesindeki esnekliğin yüksek olduğunu ve EAV veri modeline neden katılmayı seçtiklerini anlayabildiğini hatırlatıyorum. Sonuçta bu esnekliğin maliyeti performans açısından bir maliyete sahipti ve Magento'yu baştan beri mahvetti.

Genel olarak, Magento Mühendisleri, her şeyden önce mümkün olan en esnek, özelleştirilebilir sistemi oluşturmak ve daha sonra performans konusunda endişelenmekle görevlendirildiler. Magento Neden Bu Kadar Yavaş?

EAV, veri depolama için mükemmel ancak işlem için korkunç. Peki neden başlamak için indekslere ihtiyacımız var? İlişkisel modelin aynı yaklaşımı yeniden uygulandığı için, Magento artık MySQL'in kendi içinde yaptığı her şeyi halletmek zorunda. MySQL tablolarında zaten mevcut olan İndeksler gibi dikkate alınması gereken bazı şeyler. Bunu göz önünde bulundurarak, şimdi EAV veri modelini göz önünde bulundurun:

  • E ntity = Tablo
  • Bir ttribute = Alan
  • V alue = Değer

Aynı, IMO çok "anti-patern" olan yeniden uygulanmalıdır.

Ayrıca, indeksleme işlemini kilitlemek için var/lockshangi indeksleyicinin kullandığını bulmanızın nedeni aynıdır . Aynı nedenler veritabanları satır / tablo kilitleme var.

Şimdi bir kaydın, bir ürün değerinin değiştiğini söylediğinde flat tableya da index(MySQL'in buna göre dediği gibi) sayısız kayıtlar arasında tarama yapmadan hızlı ve verimli bir şekilde bulunan yeni değiştirilen verilerdeki sorgulara yansıtılmak üzere güncellenmesi gerekir. Yassı masalar, MySQL'in sahip oldukları aynı nedenden dolayı vardır, böyle bir indeks olmadan (kitap gibi) kayıt almak için tam bir masa taraması gerekir. Bu, hem Disk hem de Bellek için büyük miktarlarda G / Ç ve istenen verileri bulmak için CPU döngüleri anlamına gelir; bu da performans açısından çok zordur.

Magento, EAV veri modelini kullandığından, istenen verileri bulmak için tüm verileri bir araya getirmek için taranması gereken çok sayıda arama tablosu vardır. Flat kataloglarını devre dışı bırakırsanız olan budur. Tıpkı MySQL gibi, değerli G / Ç Döngülerini koruyarak kaydı hızlı bir şekilde bulmak için kullanılacak bir indeks (düz tablo) kullanarak kaydı taramak. Tablo oluşturmak ve herhangi bir dizin eklememek, magento'da düz tabloları kullanmamakla aynıdır. Bu iki senaryo farklı senaryolarda iyi sonuç verirken, Sonassi'deki Ben'e bakın . (İpucu, verilerin kapsamını anlamayı içerir.)

Sorunuza doğrudan bir cevap olmasa da, hareketli parçaları anlamak ve onlar için daha iyi hazırlıklı olmak, indekslemeyle gelen baş ağrılarının hafifletilmesine yardımcı olmalıdır. " Belirti yerine sorunu tedavi et. "

Modern veritabanı sistemlerinin içindekileri daha fazla araştırmak, Endekslemenin nasıl ve neden gerekli olduğu ve Magento Endekslemesi ile nasıl bir ilişki kurduğu hakkında daha iyi bir anlayışa yardımcı olabilir.

Özetlemek için: Körelmeden çözümleri uygulamadan önce sorun kapsamlarınızı anlayın. Her veri bitiğin aynısı olmayacak ve problemi iyi / tam olarak anladıktan SONRA çözümleri planlamak ve uygulamak gibi . Veri tabanı optimizasyonu değişiklik yönetimi için çok faydalı olabilir. Korkuyu önlemek gibi DEADLOCKS.

Ayrıca tüm Manualdizin oluşturucularınızı ayarlamayı düşünebilir ve dizini yoğun olmayan saatlerde (yöneticiler uzaktayken) yeniden oluşturmak için alternatif işlemler ayarlamayı düşünebilirsiniz . Sadece Product Pricesve Stock Statusayarlanmalıdır Update on Save.

Dizin oluşturmanın teknik açıdan nasıl çalıştığını düşünün. İndekslemeden ana modül sorumludur Mage_Index. Dizinleyicinin Temel modelleri: Indexer, Process, Event.

Mage_Index_Model_Indexerİndeksleyici ise, diğer modüller modülüyle tüm etkileşimler Mage_Indexbu servis aracılığıyla gerçekleşir. Aşağıdaki yöntemleri içerir:

  • processEntityAction() Etkinliği oluşturur ve kaydeder ve dizin oluşturma işlemini başlatır
  • logEvent() Bir etkinlik oluşturur ve sonraki indeksleme için kaydeder;
  • indexEvent() İndeksleme olaylarını çalıştırır;
  • getProcessesCollection()Ürün Özellikleri, Ürün Fiyatları, Katalog URL'si Yeniden Yazma, vb. Gibi tüm işlemlerin koleksiyonunu döndürür. Genellikle, yöntem gibi özü değiştirdikten sonra _afterSaveya da _afterCommitkısmi yeniden indeksleme yaparız.

Mage_Index_Model_ProcessVeya işlem dizinleyicinin özüdür mağazalarında bu durum, son çalıştığı çalışma. Tüm işlemler tabloda saklanır index_process. Program, getIndexer()modelin dizinini döndüren bir yönteme sahiptir. Endeks modelinin süreci tarafından verilen görevlerin çoğu.

Mage_Index_Model_Eventgerçekleşen olay hakkında bilgi depolar. Örneğin, ürünü depolarız ve kaydettikten sonra, yeni bir etkinlik yaratır ve hangi kimliğe ne tür bir varlık kazandırdığımızı ve bu madde için hangi işlemi yaptığımızı bildiririz.

Geçersiz kılındığı zaman genel bir listesi:

  1. katalog / ürün (SAVE, DELETE, MASS_ACTION)
  2. katalog / kategori (KAYDET, SİL)
  3. catalog / resource_eav_attribute (SAVE, DELETE)
  4. müşteri / grup (KAYDET)
  5. cataloginventory / stock_item (SAVE)
  6. etiket / etiket (SAVE)
  7. çekirdek / mağaza (KAYDET, SİL)
  8. core / store_group (SAVE, DELETE)
  9. çekirdek / web sitesi (KAYDET, SİL)

config.xmlİşlem kaydedildikten sonra , modülde kayıtlı endekse sahip herhangi bir kaynak modeli . afterCommitCallback()önek ile çağrılır. Bu, başarılı bir işlemin sonunda olduğu için dizin olaylarının kaydedildiği yerdir.

... ve EAV'nin Magento 2'de hala buralarda olması beni üzüyor.

Referanslar:


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.