Çü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/locks
hangi 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 table
ya 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 Manual
dizin 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 Prices
ve Stock Status
ayarlanmalı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_Index
bu 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 _afterSave
ya da _afterCommit
kısmi yeniden indeksleme yaparız.
Mage_Index_Model_Process
Veya 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_Event
gerç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:
- katalog / ürün (SAVE, DELETE, MASS_ACTION)
- katalog / kategori (KAYDET, SİL)
- catalog / resource_eav_attribute (SAVE, DELETE)
- müşteri / grup (KAYDET)
- cataloginventory / stock_item (SAVE)
- etiket / etiket (SAVE)
- çekirdek / mağaza (KAYDET, SİL)
- core / store_group (SAVE, DELETE)
- ç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: