Trong tài liệu chính thức:
https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html
có đoạn:
`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 là viết tắt của Chế độ xem Vật liệu, là ảnh chụp nhanh cơ sở dữ liệu tại một thời điểm.
https://en.wikipedia.org/wiki/M vật liệu_view
Tại sao chúng ta cần sao chép bảng. Trình lập chỉ mục rất tốn kém để chạy, đặc biệt khi có lưu lượng truy cập trên các trang danh mục, khách hàng đặt hàng và quản trị viên lưu sản phẩm. Trên sản phẩm lưu bộ nhớ cache bị vô hiệu (lạc đề). Trong trường hợp bộ chỉ mục chứng khoán, trước khi kết thúc thực thi, nó sẽ gửi các id thực thể bị ảnh hưởng dưới dạng các thẻ bộ đệm để được làm sạch (loại bộ đệm toàn trang). Trong Magento 2.0 loại id của sản phẩm đã mua được gửi. Trong Magento 2.1, id sản phẩm được gửi.
Có 2 bảng MySQL giữ mã và trạng thái của trình chỉ mục:
indexer_state
mview_state
mview_state
hoạt động với Update by Schedule
trong Admin> System> Indexer Management
Update by Schedule
làm cho các chỉ mục được chạy trong cron.
Có 3 mục trong 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
được chạy trên indexer_state
. Vẫn còn nhu cầu chạy bộ chỉ mục 'bình thường' trong cron
indexer_update_all_views
được chạy trên mview_state
indexer_clean_all_changelogs
- xóa các thay đổi được sử dụng bởi mview_state
Lưu ý rằng các tác vụ nhóm chỉ mục cron chạy trong một quy trình php riêng, như được khai báo trong etc/contab_groups.xml
:
<use_separate_process>1</use_separate_process>
.
Các bảng Changelog là:
[indexer name]_cl
(hậu tố với _cl
). ví dụ cataloginventory_stock_cl
. Nếu bạn có bộ chỉ mục được đặt Update by Schedule
và lưu một sản phẩm trong quản trị viên, bạn sẽ thấy entity_id
sản phẩm đó trong bảng này. Đó là một vòng tròn lớn, tôi đang nghĩ đơn hàng địa điểm hoặc tạo lô hàng cũng sẽ thêm vào đây một mục.
Ai đó đã cung cấp một ví dụ trong devdoc chính thức về cách tạo các chế độ xem cụ thể hóa mới và các phương thức giao diện cần có là gì (bỏ qua tuyên bố trên về các đơn đặt hàng trong đoạn trích dưới đây):
<?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
}
Điều này sẽ có ý nghĩa:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode
}
Trường hợp $ids
tham số có id thực thể từ *_cl
các bảng.
Liên kết giữa vô hiệu hóa bộ đệm và bộ chỉ mục là gì. Các trang danh mục hiện được lưu toàn bộ trang (bộ đệm toàn bộ trang tích hợp hoặc thông qua Varnish).
Có \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]);
}
}
Quay lại 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');
}
Trong app/etc/di.xml
đó có:
<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" />
Trong Magento\Framework\Mview\View::update()
đó có:
$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..
Nếu bạn tìm kiếm trong vendor/
thư mục, Magento\Framework\Mview\ActionInterface
bạn sẽ tìm thấy ví dụ này:
Trong \Magento\CatalogInventory\Model\Indexer
:
class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
Trong lớp này có:
/**
* Execute materialization on ids entities
*
* @param int[] $ids
*
* @return void
*/
public function execute($ids)
{
$this->_productStockIndexerRows->execute($ids);
}
Và có vẻ như nó quay trở lại phương thức thực thi của lớp chỉ mục 'bình thường' được MView sử dụng.
Về làm sạch bộ đệm sau Stock Indexer. Khi một đơn đặt hàng được đặt khi thanh toán, số lượng được trừ bằng cách sử dụng trình quan sát này:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
$itemsForReindex = $this->stockManagement->registerProductsSale(
$items,
$quote->getStore()->getWebsiteId()
);
Hơn nữa, một người quan sát khác kích hoạt bộ chỉ mục (nhưng không trực tiếp trên Mview / Indexer theo Lịch trình):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
if ($productIds) {
$this->stockIndexerProcessor->reindexList($productIds);
}
Trong trường hợp Mview, khi trừ đi số lượng mới SubtractQuoteInventoryObserver
, trình kích hoạt MySQL (được tạo cho Mview) sẽ chèn một hàng vào cataloginventory_stock_cl
, đánh dấu rằng một reindex (stock & fulltext) cần được thực hiện cho các id sản phẩm đã mua. Có nhiều trình kích hoạt MySQL được tạo cho Mview. Xem tất cả với SHOW TRIGGERS;
.
Khi một sản phẩm hết hàng sau khi thanh toán, bạn sẽ thấy 2 hàng được chèn vào bảng đó (Magento lưu 2 lần vật phẩm trong 2 quan sát viên này).
Khi cron chạy bộ chỉ mục chứng khoán ở chế độ Mview, id sản phẩm bị ảnh hưởng (trong M2.1) hoặc id danh mục (trong M2.0) được gửi đến bộ đệm sạch dưới dạng thẻ bộ đệm. Theo bộ đệm tôi có nghĩa là loại bộ đệm toàn bộ trang. Ví dụ: catalog_product_99
hoặc định dạng thẻ bộ nhớ cache khác tùy thuộc vào phiên bản Magento. Tương tự khi Mview không được kích hoạt.
\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
Và Magento_PageCache có trình quan sát \Magento\PageCache\Observer\FlushCacheByTags
sẽ xóa loại bộ đệm toàn bộ trang theo thẻ. Nó làm điều đó cho bộ nhớ cache toàn trang buil-in. Mã liên quan Varnish là trong \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.
Có một tiện ích mở rộng miễn phí sẽ từ chối xóa bộ nhớ cache trên các sản phẩm trong kho sau khi khách hàng thanh toán:
https://github.com/daniel-ifrim/innovo-cache-improve
Chỉ làm sạch bộ nhớ cache trên các sản phẩm hết hàng sau khi thanh toán được giới thiệu mặc định Magento 2.2.x. Xem \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.
Tôi nghĩ rằng việc thực hiện cron cho bộ chỉ mục Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
nên được đặt thành nhiều hơn 1 phút.
Mview
đề cập đến các khung nhìn cụ thể hóa , đó là những gì các bảng chỉ mục.