Magento Index Management

Index rất quan trọng trong Magento cũng như tất cả hệ thống có lượng rất lớn trong nhiều bảng. Nó là 1 phần trợ thụ đắc lực cho hiệu năng của flatform. Trong bài viết chúng ta sẽ cũng nhau thảo luận về các khía cạnh kỹ thuật của index magento mà chúng ta phải biết cũng như tạo một custom index.

1. What is indexing in Magento 2?
Một index là một bảng được định dạng nhất định trong database. Magento index xử lý converts data để tăng hiệu năng. Nó cần thiết bởi vì dữ liệu cho một online store được lưu trư rất phức tạp trong dữ liệu quan hệ. Ví dụ chúng ta muốn tìm giá của sản phẩm, chúng ta phải xử lý rất nhiều bảng và kết nối giữa chúng.
Từ đó index ra đời để xử lý và format lại dữ liệu để giảm gánh nặng server và tăng tốc độ của store. Tuy nhiên nó yêu cầu indexing khi có bất kỳ thay đổi của dữ liệu.

2. Default indexes in Magento 2


3. Magento 2 Indexation Terminology

  • Dictionary là dữ liệu chính thức được nạp vào hệ thống

  • Index là đại diện(hay là bản copy) của dữ liệu gốc để tối ưu lúc reading và searching. Nó phải được update khi mà có bất cứ thay đổi nào của Dictionary

  • Indexer là một đối tượng để tạo vào update Index

4. Magento 2 index update
Để thực hiện các tác vụ update dữ liệu, indexer phải được update liên tục theo thời gian. Vậy chúng ta có 3 cách để thực hiện chúng:

  • Scheduled updates: Được thực hiện bởi cron
  • Magento index update on save: Được khởi tạo mỗi khi dữu liệu được sửa đổi hoặc lưu lại
  • Manual Update: Dân dev hay dùng qua terminal:
    php bin/magento indexer:reindex

Ngoài chúng ta cũng có thể quản lý index thông qua admin panel: (System> Index Management ).


5. Mechanism of indexation by schedule, Mview

Mỗi khi có bất kỹ thay đổi nào trong đối tượng database magento 2, hệ thống sẽ có indexer để thực hiện, một trigger xuất hiện trong bảng _cl (postfix) nếu bảng này tồn tại, ngược lại không tồn tại thì bảng này sẽ được tạo tự động. mview.xml chịu trách nhiệm định nghĩa dữ liệu thay đổi để track thay đổi trong _cl(change log) table.
Ví dụ trong core magento Magento/Catalog/etc/mview.xml


<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Mview/etc/mview.xsd">
…
<view id="catalog_category_product" class="Magento\Catalog\Model\Indexer\Category\Product" group="indexer">
   <subscriptions>
       <table name="catalog_category_entity" entity_column="entity_id" />
       <table name="catalog_category_entity_int" entity_column="entity_id" />
   </subscriptions>
</view>
…
</config>

Từ code trên thì bạn sẽ thấy catalog_category_product_cl được tạo trong db. Nó đảm bảo thông tin lịch sử thay đổi được lưu lại khi có dữ thay đổi của catalog_category_entitycatalog_category_entity_int tables.

6. How create custom index

  • Tạo file etc/indexer.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
   <indexer id="magestore_customcron_indexer
" view_id="magestore_customcron_indexer
" class="Module\Vender\Model\Indexer\Example">
       <title translate="true">Indexer Example</title>
       <description translate="true">custom indexer</description>
   </indexer>
</config>
  • Tạo file etc/mview.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Mview/etc/mview.xsd">
   <view id="magestore_customcron_indexer" class="Module\Vender\Model\Indexer\Example" group="indexer">
       <subscriptions>
           <table name="catalog_product_entity" entity_column="entity_id" />
       </subscriptions>
   </view>
</config>
  • Bây giờ chúng ta tạo file Model/Indexer/Example.php
<?php
namespace Module\Vender\Model\Indexer;
 
class Example implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
{
   /*
    * Used by mview, allows process indexer in the "Update on schedule" mode
    */
   public function execute($ids){
       //Used by mview, allows you to process multiple placed orders in the "Update on schedule" mode
   }
 
   /*
    * Will take all of the data and reindex
    * Will run when reindex via command line
    */
   public function executeFull(){
       //Should take into account all placed orders in the system
   }
 
   /*
    * Works with a set of entity changed (may be massaction)
    */
   public function executeList(array $ids){
       //Works with a set of placed orders (mass actions and so on)
   }
 
   /*
    * Works in runtime for a single entity using plugins
    */
   public function executeRow($id){
       //Works in runtime for a single order using plugins
   }
}
  • Làm sao để index được chạy một cách automatically theo thời gian. Chúng ta tạo file etc/crontab.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
   <group id="index">
       <job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Cron\ReindexAllInvalid" method="execute">
           <schedule>0 4 * * *</schedule>
       </job>
   </group>
</config>

Bằng để như sau thì nó sẽ chạy vào lúc 4am mỗi ngày.

Trên đây là bài viết về index management trong Magento 2 trong vài tuần fix bug của mình. Hi vọng bài viết có thể giúp ích cho mọi người. Nếu có câu hỏi mọi người để lại bình luận để mình có thể thảo luận. Cảm ơn mọi người

2 Likes