mview ใน magento2 คืออะไร


28

ก่อนอื่นสิ่งที่ฉันรู้:

การจัดการดัชนีมีประโยชน์สำหรับการเพิ่มประสิทธิภาพการจัดเก็บ

EAV มีหนึ่งข้อเสียมันจะเก็บข้อมูลลงในตารางที่แตกต่างกันดังนั้นการดึงข้อมูลใช้เวลานาน

เพื่อที่เราจะเก็บข้อมูลไว้ในตารางเดียว เมื่อข้อมูลมีการเปลี่ยนแปลงเราจะอัปเดตตารางเดียวนี้ (ไม่มีอะไรนอกจากการอัปเดตการทำดัชนี)

mysql trigger: ดำเนินการกระทำแบบสอบถามบางอย่างขึ้นอยู่กับการแทรก / ปรับปรุง / ลบบางตาราง

ดังนั้นวีโอไอพีที่ใช้ทริกเกอร์เช่นเมื่อราคากำลังอัพเดทมันจะเก็บไว้entity_idในตารางการเปลี่ยนแปลง

มีคำสั่งในการ devdocs Magento/Framework/Mviewสำหรับการดำเนินการเรียกใช้

คุณช่วยอธิบายโฟลว์ของฟังก์ชั่นนี้ได้ไหม

ผมหมายถึงสิ่งที่เป็นview, action, processoretc?


2
ไม่แน่ใจเกี่ยวกับการไหล แต่Mviewหมายถึงมุมมองที่ปรากฏขึ้นซึ่งเป็นสิ่งที่ตารางดัชนี
nevvermind

คำตอบ:


55

ในเอกสารอย่างเป็นทางการ: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html มีการขโมย:

`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 ย่อมาจาก Materialized View ซึ่งเป็นภาพรวมของฐานข้อมูล ณ เวลาหนึ่ง ๆ https://en.wikipedia.org/wiki/Materialized_view ทำไมเราต้องทำสำเนาตาราง ดัชนีมีค่าใช้จ่ายสูงโดยเฉพาะเมื่อมีปริมาณการใช้งานในหน้าหมวดหมู่ลูกค้าสั่งซื้อสินค้าและผู้ดูแลระบบบันทึกสินค้า ในผลิตภัณฑ์บันทึกแคชได้รับการตรวจสอบความถูกต้อง (นอกหัวข้อ) ในกรณีของตัวทำดัชนีหุ้นก่อนที่จะสิ้นสุดการดำเนินการมันจะส่งรหัสเอนทิตีที่ได้รับผลกระทบเป็นแท็กแคชที่จะทำความสะอาด (ประเภทแคชแบบเต็มหน้า) ในรหัสวีโอไอพีประเภท 2.0 ของผลิตภัณฑ์ที่ซื้อจะถูกส่งไป ใน Magento 2.1 รหัสผลิตภัณฑ์จะถูกส่งไป

มีตาราง MySQL 2 ตัวที่เก็บรหัสและสถานะของตัวทำดัชนี:

  • indexer_state
  • mview_state

mview_stateทำงานร่วมกับUpdate by Scheduleในผู้ดูแลระบบ> ระบบ> การจัดการดัชนี

Update by Schedule ทำให้ตัวสร้างดัชนีทำงานใน cron

มี 3 รายการใน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_invalidindexer_stateทำงานบน ยังคงมีความจำเป็นต้องเรียกใช้ตัวทำดัชนี 'ปกติ' ใน cron
  • indexer_update_all_views ทำงานอยู่ mview_state
  • indexer_clean_all_changelogs - ล้างการเปลี่ยนแปลงที่ใช้โดย mview_state

โปรดทราบว่ากลุ่มงาน cron ดัชนีทำงานในกระบวนการ PHP แยกประกาศ:etc/contab_groups.xml <use_separate_process>1</use_separate_process>

ตารางการเปลี่ยนแปลงคือ: [indexer name]_cl( _clต่อท้ายด้วย) cataloginventory_stock_clเช่น หากคุณมีตัวทำดัชนีตั้งค่าUpdate by Scheduleและบันทึกผลิตภัณฑ์ในผู้ดูแลระบบคุณจะเห็นentity_idผลิตภัณฑ์นั้นในตารางนี้ มันเป็นวงกลมใหญ่ฉันกำลังสั่งซื้อหรือสร้างการจัดส่งจะเพิ่มที่นี่ด้วย

มีคนให้ตัวอย่างใน devdoc อย่างเป็นทางการเกี่ยวกับวิธีการสร้างมุมมองที่เป็นรูปธรรมใหม่และวิธีการอินเทอร์เฟซที่ต้องการคืออะไร

<?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
}

สิ่งนี้จะสมเหตุสมผล: //public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode } โดยที่$idsพารามิเตอร์มีเอนทิตี id จาก*_clตาราง

การเชื่อมโยงระหว่างการตรวจสอบแคชและดัชนี ขณะนี้หน้าหมวดหมู่ถูกแคชแบบเต็มหน้า (แคชแบบเต็มหน้าในตัวหรือผ่านการเคลือบเงา)

มี\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]);
    }
}

กลับไปที่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');
}

ในapp/etc/di.xmlนั้นคือ:

<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" />

ในMagento\Framework\Mview\View::update()นั้นคือ:

$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..

หากคุณค้นหาในvendor/ไดเรกทอรีMagento\Framework\Mview\ActionInterfaceคุณจะพบตัวอย่างนี้:

ใน\Magento\CatalogInventory\Model\Indexer:

class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface

ในชั้นเรียนนี้มี:

/**
 * Execute materialization on ids entities
 *
 * @param int[] $ids
 *
 * @return void
 */
public function execute($ids)
{
    $this->_productStockIndexerRows->execute($ids);
}

และดูเหมือนว่าจะกลับไปที่ 'ปกติ' คลาสของ indexers 'method' ซึ่ง MView ใช้

เกี่ยวกับการล้างแคชหลังจาก Stock Indexer เมื่อมีการสั่งซื้อสินค้าเมื่อชำระเงินปริมาณจะถูกหักออกโดยใช้ผู้สังเกตการณ์นี้:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver

$itemsForReindex = $this->stockManagement->registerProductsSale(
    $items,
    $quote->getStore()->getWebsiteId()
);

นอกจากนี้ผู้สังเกตการณ์อีกคนหนึ่งเรียกใช้ตัวสร้างดัชนี (แต่ไม่ใช่โดยตรงบน Mview / ดัชนีตามตารางเวลา): \Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver

if ($productIds) {
    $this->stockIndexerProcessor->reindexList($productIds);
}

ในกรณี Mview เมื่อมีการลบจำนวนใหม่SubtractQuoteInventoryObserverทริกเกอร์ MySQL (สร้างขึ้นสำหรับ Mview) จะแทรกแถวในcataloginventory_stock_clทำเครื่องหมายว่าต้องการทำดัชนี (สต็อกและข้อความเต็ม) สำหรับรหัสผลิตภัณฑ์ที่ซื้อ มีทริกเกอร์ MySQL มากมายที่สร้างขึ้นสำหรับ Mview SHOW TRIGGERS;เห็นพวกเขาทั้งหมดที่มี

เมื่อสินค้าหมดหลังจากชำระเงินคุณจะเห็น 2 แถวแทรกอยู่ในตารางนั้น (วีโอไอพีจะประหยัด 2 เท่าของรายการสินค้าใน 2 ผู้สังเกตการณ์เหล่านี้)

เมื่อ cron รันตัวสร้างดัชนีหุ้นในโหมด Mview รหัสผลิตภัณฑ์ที่ได้รับผลกระทบ (ใน M2.1) หรือรหัสหมวดหมู่ (ใน M2.0) จะถูกส่งไปยังแคชสะอาดเป็นแท็กแคช โดยแคชฉันหมายถึงประเภทแคชแบบเต็มหน้า ตัวอย่าง: catalog_product_99หรือรูปแบบแคชแท็กอื่น ๆ ขึ้นอยู่กับเวอร์ชั่นของวีโอไอพี เช่นเดียวกันเมื่อไม่ได้เปิดใช้งาน Mview

\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows

...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);

และ Magento_PageCache มีผู้สังเกตการณ์\Magento\PageCache\Observer\FlushCacheByTagsที่จะล้างแคชแบบเต็มหน้าด้วยแท็ก มันใช้สำหรับแคชแบบเต็มหน้าของ buil-in \Magento\CacheInvalidate\Observer\InvalidateVarnishObserverวานิชรหัสที่เกี่ยวข้องอยู่ใน

มีส่วนขยายฟรีที่จะปฏิเสธแคชที่ยังคงมีอยู่ในสต็อกผลิตภัณฑ์หลังจากชำระเงินของลูกค้า:

https://github.com/daniel-ifrim/innovo-cache-improve

การทำความสะอาดแคชเฉพาะสินค้าที่หมดหลังจากการชำระเงินถูกนำมาใช้ใน Magento 2.2.x ที่เป็นค่าเริ่มต้น \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleanerดู

ฉันคิดว่าการดำเนินการ cron สำหรับตัวสร้างดัชนีAdmin > Stores > Configuration > Advanced > System > Cron configuration options for group: indexควรตั้งค่ามากกว่า 1 นาที


6

mview.xmlถูกนำมาใช้พร้อมกับindexer.xmlการติดตั้ง indexers

mview.xmlไฟล์ประกาศ:

  • ID มุมมองตัวสร้างดัชนี
  • คลาสตัวทำดัชนี
  • ตารางฐานข้อมูลแทร็กตัวจัดทำดัชนี
  • ข้อมูลคอลัมน์ใดที่ถูกส่งไปยังตัวทำดัชนี

indexer.xmlไฟล์ประกาศ:

  • ID ตัวจัดทำดัชนี
  • ชื่อคลาสตัวจัดทำดัชนี
  • ชื่อตัวสร้างดัชนี
  • คำอธิบายตัวสร้างดัชนี
  • ID มุมมองตัวสร้างดัชนี

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการประกาศตัวทำดัชนีแบบกำหนดเองได้ที่นี่: ตัวสร้างดัชนีแบบกำหนดเองบน Magento2

จากสิ่งที่ฉันเข้าใจมีสองสิ่งที่แตกต่างกันที่นี่:

  • ตัวสร้างดัชนีจากMagento_Indexerโมดูล
  • Mview Magento\Framework\Mviewซึ่งจำลองมุมมองที่เป็นรูปธรรมสำหรับ MySQL โดยใช้ทริกเกอร์

นี่คือข้อมูลบางส่วนจากเอกสารที่เป็นทางการ

ประเภทการจัดทำดัชนี

แต่ละดัชนีสามารถดำเนินการทำดัชนีประเภทต่อไปนี้อีกครั้ง:

  • การทำดัชนีซ้ำแบบเต็มซึ่งหมายถึงการสร้างตารางฐานข้อมูลที่เกี่ยวข้องกับการทำดัชนีใหม่ทั้งหมด

  • การทำดัชนีใหม่ทั้งหมดอาจเกิดจากสิ่งต่าง ๆ รวมถึงการสร้างร้านค้าบนเว็บใหม่หรือกลุ่มลูกค้าใหม่ คุณสามารถเลือกทำดัชนีใหม่ทั้งหมดได้ตลอดเวลาโดยใช้บรรทัดคำสั่ง

  • การทำดัชนีใหม่บางส่วนซึ่งหมายถึงการสร้างตารางฐานข้อมูลใหม่สำหรับสิ่งที่เปลี่ยนแปลง (ตัวอย่างเช่นการเปลี่ยนแอตทริบิวต์ผลิตภัณฑ์หรือราคาเดียว)

ประเภทของการทำดัชนีใหม่ในแต่ละกรณีนั้นขึ้นอยู่กับประเภทของการเปลี่ยนแปลงที่เกิดขึ้นในพจนานุกรมหรือในระบบ การพึ่งพานี้มีเฉพาะสำหรับตัวทำดัชนีแต่ละตัว

เกี่ยวกับเวิร์กโฟลว์นี่เป็นเพียงการทำดัชนีบางส่วนใหม่:

ป้อนคำอธิบายรูปภาพที่นี่


1
มีข้อผิดพลาดในเอกสารประกอบ github.com/magento/magento2/issues/4658
Sivakumar K

6

เอกสารอ้างอิงจาก Magento อยู่ที่นี่แล้วดังนั้นฉันจึงข้ามส่วนนั้นไป
Magento ใช้มุมมองที่เป็นรูปธรรมใน 2.0 ซึ่งติดตามการเปลี่ยนแปลงสำหรับตัวทำดัชนีทั้งหมด ตัวสร้างดัชนีแต่ละตัวมี_clตารางที่รับentity_idและauto_increment version_idเพิ่มทริกเกอร์จากบนตารางหลัก
เมื่องาน cron ดำเนินการตัวสร้างดัชนีจะได้รับล่าสุดversion_idสำหรับแต่ละมุมมองจากmview_stateตารางและดัชนีเอนทิตีถัดไปที่มีอยู่ใน_clตาราง
การสร้างดัชนีใหม่จะทำให้ปวดหัวจนถึง 1.9.xx และด้วยแคตตาล็อกขนาดใหญ่มันจะทำให้ระบบช้าลงเสมอ
ในตัวทำดัชนี Magento 2.0 อัพเดตเฉพาะข้อมูลเอนทิตีเฉพาะบนตารางตัวทำดัชนีแทนการทำดัชนีข้อมูลทั้งหมดใหม่ ทำให้ลูกบอลกลิ้งโดยไม่ทำให้เซิร์ฟเวอร์ช้าลง
หมายเหตุ: Materialized View ไม่ได้รับการสนับสนุนใน mysql ดังนั้นใน Magento จะถูกจัดการโดยโค้ด PHP และทำงานคล้ายกับ Materialized View ซึ่งเป็นคุณลักษณะใน DBMS ระดับองค์กรเช่น oracle


"Magento ใช้มุมมอง materialized ใน 2.0" - จริงๆแล้วมันมีอยู่ใน Magento 1 EE ชั่วครู่หนึ่ง
Robbie Averill

"ในตัวทำดัชนี Magento 2.0 อัพเดตเฉพาะข้อมูลเอนทิตีบนตารางตัวทำดัชนีแทนที่จะทำดัชนีข้อมูลทั้งหมดใหม่อีกครั้ง" - อีกครั้งมีการทำดัชนีการทำดัชนีบางส่วนใน Magento 1 อีกครั้ง
Robbie Averill

ฉันสร้างข้อความตามรุ่นของชุมชนเท่านั้น
Aman Srivastava
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.