mview trong magento2 là gì?


28

Trước hết những gì tôi biết:

Quản lý chỉ số là hữu ích để tăng hiệu suất cửa hàng.

EAV có một nhược điểm. Nó sẽ lưu trữ dữ liệu vào các bảng khác nhau. Do đó, việc truy xuất dữ liệu rất tốn thời gian.

Vì vậy, chúng tôi sẽ lưu trữ dữ liệu vào bảng duy nhất. khi dữ liệu được thay đổi, chúng tôi sẽ cập nhật bảng duy nhất này (không có gì ngoài cập nhật chỉ mục)

mysql trigger: thực hiện một số hành động truy vấn dựa trên một số bảng chèn / cập nhật / xóa.

Vì vậy, magento sử dụng kích hoạt chẳng hạn khi giá đang cập nhật, nó sẽ lưu entity_idvào bảng changelog.

có một tuyên bố trong devdocs để thực hiện kích hoạt magento2 bằng cách sử dụng Magento/Framework/Mview.

bạn có thể giải thích dòng chảy của chức năng này không

tôi có nghĩa là gì view, action, processorvv?


2
Không chắc chắn về luồng, nhưng Mviewđề cập đến các khung nhìn cụ thể hóa , đó là những gì các bảng chỉ mục.
nevvermind

Câu trả lời:


55

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_statehoạt động với Update by Scheduletrong 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 Schedulevà lưu một sản phẩm trong quản trị viên, bạn sẽ thấy entity_idsả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 $idstham số có id thực thể từ *_clcá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).

\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\ActionInterfacebạ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_99hoặ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\FlushCacheByTagssẽ 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: indexnên được đặt thành nhiều hơn 1 phút.


6

mview.xmlđược sử dụng cùng với indexer.xmlđể thiết lập bộ chỉ mục.

Các mview.xmltập tin tuyên bố:

  • ID chỉ mục xem
  • lớp chỉ mục
  • bảng cơ sở dữ liệu theo dõi bộ chỉ mục
  • dữ liệu cột nào được gửi đến bộ chỉ mục

Các indexer.xmltập tin tuyên bố:

  • ID chỉ mục
  • tên lớp chỉ mục
  • tiêu đề
  • mô tả chỉ mục
  • ID chỉ mục xem

Bạn có thể tìm thêm thông tin về khai báo bộ chỉ mục tùy chỉnh tại đây: Bộ chỉ mục tùy chỉnh trên Magento2

Từ những gì tôi hiểu, có hai điều khác nhau ở đây:

  • Bộ chỉ mục từ Magento_Indexermô-đun
  • Mview từ Magento\Framework\Mviewđó mô phỏng khung nhìn cụ thể hóa cho MySQL bằng cách sử dụng các kích hoạt.

Dưới đây là một số thông tin được nhấn mạnh từ các tài liệu chính thức

Các loại chỉ mục

Mỗi chỉ mục có thể thực hiện các loại hoạt động reindex sau:

  • Reindex đầy đủ, có nghĩa là xây dựng lại tất cả các bảng cơ sở dữ liệu liên quan đến lập chỉ mục.

  • Reindexing đầy đủ có thể được gây ra bởi nhiều thứ, bao gồm cả việc tạo một cửa hàng web mới hoặc nhóm khách hàng mới. Bạn có thể tùy chọn reindex hoàn toàn bất cứ lúc nào bằng cách sử dụng dòng lệnh.

  • Reindex một phần, có nghĩa là xây dựng lại các bảng cơ sở dữ liệu chỉ cho những thứ đã thay đổi (ví dụ: thay đổi một thuộc tính sản phẩm hoặc giá).

Loại reindex được thực hiện trong từng trường hợp cụ thể phụ thuộc vào loại thay đổi được thực hiện trong từ điển hoặc trong hệ thống. Sự phụ thuộc này là cụ thể cho từng người lập chỉ mục.

Về quy trình làm việc, đây là phần giới thiệu lại một phần:

nhập mô tả hình ảnh ở đây


1
có một lỗi trong tài liệu. github.com/magento/magento2/issues/4658
Sivakumar K

6

Tham khảo từ tài liệu Magento đã có ở đây vì vậy tôi bỏ qua phần đó.
Magento đã triển khai chế độ xem cụ thể hóa trong 2.0 để theo dõi các thay đổi cho tất cả các người lập chỉ mục. Mỗi bộ chỉ mục có một _clbảng được entity_idvà một auto_increment version_idtừ các kích hoạt được thêm vào các bảng chính.
Khi công việc cron thực thi, bộ chỉ mục sẽ được cuối cùng version_idcho mỗi chế độ xem từ mview_statebảng và lập chỉ mục các thực thể có sẵn tiếp theo trong _clbảng.
Reindexing là một vấn đề đau đầu cho đến 1.9.xx và với danh mục khổng lồ, nó luôn làm chậm hệ thống.
Trong bộ chỉ mục Magento 2.0 chỉ cập nhật thông tin thực thể cụ thể trên các bảng chỉ mục chứ không phải lập lại toàn bộ dữ liệu. Điều này giữ cho bóng lăn mà không làm chậm máy chủ.
Lưu ý: Chế độ xem được vật chất hóa không được hỗ trợ trong mysql, vì vậy trong Magento, nó được quản lý bằng mã PHP và nó hoạt động tương tự như chế độ xem Vật liệu hóa, là một tính năng trong DBMS cấp doanh nghiệp như oracle.


"Magento đã triển khai chế độ xem cụ thể hóa trong 2.0" - thực sự nó đã có ở Magento 1 EE một thời gian
Robbie Averill

"Trong chỉ mục Magento 2.0 chỉ cập nhật thông tin thực thể cụ thể trên các bảng chỉ mục chứ không phải lập lại toàn bộ dữ liệu." - một lần nữa, reindexing cũng tồn tại trong Magento 1
Robbie Averill

Tôi đã tuyên bố chỉ dựa trên các phiên bản cộng đồng.
Aman Srivastava
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.