Pertama-tama yang saya tahu:
Manajemen indeks berguna untuk meningkatkan kinerja toko.
EAV
memiliki satu kelemahan. itu akan menyimpan data ke dalam tabel yang berbeda. sehingga pengambilan data memakan waktu.
Sehingga kami akan menyimpan data ke dalam satu tabel. ketika data diubah, kami akan memperbarui tabel tunggal ini (tidak lain dari pembaruan pengindeksan)
mysql trigger
: melakukan beberapa tindakan kueri berdasarkan beberapa tabel sisipkan / perbarui / hapus.
Jadi magento menggunakan pemicu misalnya ketika harga memperbarui itu akan menyimpan entity_id
ke tabel changelog.
ada pernyataan di devdocs untuk menerapkan pemicu penggunaan magento2 Magento/Framework/Mview
.
dapatkah Anda menjelaskan aliran fungsi ini?
Maksudku apa view
, action
, processor
dll?
Mview
mengacu pada tampilan terwujud , yang merupakan tabel indeks.Jawaban:
Dalam dokumentasi resmi: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html ada stement:
MView adalah singkatan dari Materialized View yang merupakan snapshot dari database pada suatu titik waktu. https://en.wikipedia.org/wiki/Materialized_view Mengapa kita perlu menduplikasi tabel. Pengindeks mahal untuk dijalankan, terutama ketika ada lalu lintas pada halaman kategori, pelanggan memesan dan admin menyimpan produk. Pada produk, menyimpan cache menjadi tidak valid (di luar topik). Dalam hal pengindeks stok, sebelum mengakhiri eksekusi, ia akan mengirim id entitas yang terpengaruh sebagai tag cache untuk dibersihkan (tipe cache halaman penuh). Di Magento 2.0 kategori id produk yang dibeli dikirim. Di Magento 2.1 id produk dikirim.
Ada 2 tabel MySQL yang menyimpan kode dan status pengindeks:
indexer_state
mview_state
mview_state
berfungsi denganUpdate by Schedule
di Admin> Sistem> Manajemen PengindeksUpdate by Schedule
membuat pengindeks dijalankan di cron.Ada 3 entri di
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
dijalankanindexer_state
. Masih ada kebutuhan untuk menjalankan pengindeks 'normal' di cronindexer_update_all_views
dijalankanmview_state
indexer_clean_all_changelogs
- Menghapus changelog yang digunakan olehmview_state
Perhatikan bahwa tugas-tugas kelompok cron pengindeks berjalan dalam proses php terpisah, sebagaimana dinyatakan dalam
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.Tabel changelog adalah:
[indexer name]_cl
(diakhiri dengan_cl
). miscataloginventory_stock_cl
. Jika Anda memiliki pengindeks diatur keUpdate by Schedule
dan menyimpan produk di admin Anda akan melihatentity_id
produk itu dalam tabel ini. Ini lingkaran besar, saya pikir pesanan tempat atau membuat pengiriman akan menambahkan entri di sini juga.Seseorang memberikan contoh di devdoc resmi tentang cara membuat tampilan terwujud baru dan apa saja metode antarmuka yang diperlukan (abaikan pernyataan di atas tentang pesanan dalam snippet di bawah):
Ini masuk akal:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
Di mana$ids
parameter memiliki id entitas dari*_cl
tabel.Apa hubungan antara pembatalan cache dan pengindeks. Halaman kategori sekarang di-cache halaman penuh (cache halaman penuh built-in atau melalui Varnish).
Ada
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Kembali ke
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:Di
app/etc/di.xml
sana ada:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
Di
Magento\Framework\Mview\View::update()
sana ada:Jika Anda mencari di
vendor/
direktori untukMagento\Framework\Mview\ActionInterface
Anda akan menemukan misalnya ini:Di
\Magento\CatalogInventory\Model\Indexer
:Di kelas ini ada:
Dan sepertinya kembali ke metode 'eksekusi' kelas 'pengindeks' yang digunakan oleh MView.
Tentang pembersihan cache setelah Stock Indexer. Ketika pesanan dilakukan pada checkout, jumlah dikurangi menggunakan pengamat ini:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Lebih lanjut, pengamat lain memicu pengindeks (tetapi tidak secara langsung pada Mview / Pengindeks berdasarkan Jadwal):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
Dalam kasus Mview, ketika jumlah baru dikurangi
SubtractQuoteInventoryObserver
, pemicu MySQL (dibuat untuk Mview) akan memasukkan bariscataloginventory_stock_cl
, menandai bahwa pengindeksan ulang (stok & teks lengkap) perlu dilakukan untuk id produk yang dibeli. Ada banyak pemicu MySQL yang dibuat untuk Mview. Lihat semuanyaSHOW TRIGGERS;
.Ketika suatu produk kehabisan stok setelah checkout Anda akan melihat 2 baris dimasukkan dalam tabel itu (Magento menyimpan 2 kali stok item dalam 2 pengamat ini).
Ketika cron menjalankan stock indexer dalam mode Mview, id produk yang terpengaruh (dalam M2.1) atau id kategori (dalam M2.0) dikirim ke cache bersih sebagai tag cache. Yang saya maksud dengan cache adalah jenis cache halaman penuh. Contoh:
catalog_product_99
atau format tag cache lainnya tergantung pada versi Magento. Sama ketika Mview tidak diaktifkan.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
Dan Magento_PageCache memiliki pengamat
\Magento\PageCache\Observer\FlushCacheByTags
yang akan membersihkan jenis cache halaman penuh dengan tag. Itu melakukannya untuk buil-in cache halaman penuh. Kode terkait pernis ada di\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Ada ekstensi gratis yang akan menolak pembersihan cache dari masih dalam stok produk setelah checkout pelanggan:
https://github.com/daniel-ifrim/innovo-cache-improve
Pembersihan cache hanya pada produk yang tidak tersedia setelah checkout diperkenalkan di Magento 2.2.x default Lihat
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Saya pikir eksekusi cron untuk pengindeks
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
harus diatur lebih dari 1 menit.sumber
The
mview.xml
digunakan bersama denganindexer.xml
ke pengindeks setup.The
mview.xml
File menyatakan:The
indexer.xml
File menyatakan:Anda dapat menemukan informasi lebih lanjut tentang deklarasi pengindeksan kustom di sini: Custom indexer di Magento2
Dari apa yang saya mengerti, ada dua hal berbeda di sini:
Magento_Indexer
modulMagento\Framework\Mview
yang mengemulasi tampilan terwujud untuk MySQL menggunakan pemicu.Berikut adalah beberapa info terukir dari dokumentasi resmi
Jenis pengindeksan
Mengenai Alur Kerja, ini dia untuk pengindeksan ulang sebagian:
sumber
Referensi dari dokumen Magento sudah ada di sini jadi saya melewatkan bagian itu.
Magento mengimplementasikan tampilan terwujud dalam 2.0 yang melacak perubahan untuk semua pengindeks. Setiap pengindeks memiliki
_cl
tabel yang mendapatentity_id
danauto_increment
version_id
dari pemicu ditambahkan pada tabel utama.Ketika cron job dijalankan, indexer menjadi yang terakhir
version_id
untuk setiap tampilan darimview_state
tabel dan mengindeks entitas yang tersedia berikutnya dalam_cl
tabel.Reindexing adalah sakit kepala sampai 1.9.xx dan dengan katalog besar itu selalu memperlambat sistem.
Dalam pengindeks Magento 2.0 hanya memperbarui informasi entitas tertentu pada tabel pengindeks daripada mengindeks ulang seluruh data. Ini membuat bola terus bergulir tanpa memperlambat server.
Catatan: Tampilan Terwujud tidak didukung di mysql jadi di Magento, ini dikelola oleh kode PHP dan bekerja mirip dengan tampilan Terwujud yang merupakan fitur dalam DBMS tingkat perusahaan seperti oracle.
sumber