ดัชนีจะไม่ถูกต้องเมื่อใด


23

ฉันมีร้านค้าและทุกครั้งที่ดัชนีทั้งหมดไม่ถูกต้อง ฉันสังเกตเห็นว่าฉันไม่มีเงื่อนงำเมื่อดัชนีไม่ถูกต้อง

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

  • คุณสมบัติของผลิตภัณฑ์
  • ราคาสินค้า
  • แคตตาล็อกการเขียน URL ใหม่
  • ข้อมูลแบนของผลิตภัณฑ์
  • หมวดหมู่ผลิตภัณฑ์
  • ดัชนีการค้นหาแคตตาล็อก
  • ข้อมูลการรวมแท็ก
  • สถานะสินค้า

คำตอบ:


18

ทำ grep ในไดเรกทอรีของรหัสคุณจะได้รับรายชื่อของไฟล์ที่ทริกเกอร์การทำให้ใช้งานไม่ได้ grep -Ri '::STATUS_REQUIRE_REINDEX' .

ไฟล์แกนต่อไปนี้จะทริกเกอร์การทำให้ใช้งานไม่ได้

./core/Mage/CatalogSearch/Model/Indexer/Fulltext.php
./core/Mage/Catalog/Model/Product/Indexer/Flat.php
./core/Mage/Catalog/Model/Product/Indexer/Price.php
./core/Mage/Catalog/Model/Category/Indexer/Flat.php
./core/Mage/Catalog/Model/Category/Indexer/Product.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Category/Flat.php
./core/Mage/Catalog/Model/Indexer/Url.php
./core/Mage/Backup/Helper/Data.php
./core/Mage/CatalogInventory/Model/Indexer/Stock.php
./core/Mage/ImportExport/Model/Import.php

เหตุการณ์พื้นฐานใน Magento CE เป็นหลัก

คุณสมบัติของผลิตภัณฑ์

แอตทริบิวต์ save เฉพาะ (เป็นส่วนหนึ่งของผลิตภัณฑ์ flat), store, store_group หากเปิดใช้งานผลิตภัณฑ์แค็ตตาล็อก

ราคาสินค้า

การตรวจสอบการตั้งค่าการกำหนดค่าบันทึก (เช่นขอบเขตราคา) หรือบันทึกผลิตภัณฑ์สร้าง / ลบเว็บไซต์

แคตตาล็อกการเขียน URL ใหม่

ไม่มีการตรวจสอบเฉพาะ

ข้อมูลแบนของผลิตภัณฑ์

แอ็ตทริบิวต์การบันทึกเฉพาะ (เป็นส่วนหนึ่งของผลิตภัณฑ์แบบแบน) หากเปิดใช้งานผลิตภัณฑ์แค็ตตาล็อกแบบแบนหลังจากเปิดใช้งานผลิตภัณฑ์แบบแบน

หมวดหมู่ข้อมูลแบน

ตรวจสอบว่ามีการเปิดใช้งานหมวดหมู่แฟลตแคตตาล็อกและหมวดหมู่การบันทึกเฉพาะ, หลังจากเปิดใช้งานหมวดแบน

หมวดหมู่ผลิตภัณฑ์

ตรวจสอบเป็นหมวดหมู่แคตตาล็อกแบนเปิดใช้งานและหมวดหมู่บันทึกเฉพาะ

ดัชนีการค้นหาแคตตาล็อก

แอตทริบิวต์ save เฉพาะ (เป็นส่วนหนึ่งของคุณลักษณะที่ค้นหาได้), store, store_group หากเปิดใช้งานผลิตภัณฑ์แค็ตตาล็อกแบบแบน

ข้อมูลการรวมแท็ก

ไม่ถูกยกเลิกยกเว้นเงื่อนไขทั่วไปที่ระบุไว้ด้านล่าง

สถานะสินค้า

ระบบที่เฉพาะเจาะจง> การตั้งค่าในแท็บสินค้าคงคลังบันทึกบันทึกแสดงผลิตภัณฑ์หมดเช่น

พวกเขาทั้งหมดจะไม่ถูกต้องหลังจากการย้อนกลับในการสำรองข้อมูลจากSystem > Tools > Backupและสร้างลบหรือย้ายไปรอบ ๆ เว็บไซต์ร้านค้าและ storeviews หลังจากรัน dataflow นำเข้าสำหรับผลิตภัณฑ์ต่อไปนี้จะไม่ถูกต้อง: catalog_product_price, catalog_category_product

ตัวจัดทำดัชนีหลายตัวเช่นข้อมูลแฟลตและตัวสร้างดัชนี URL ดูเหมือนว่าจะไม่ถูกต้องด้วยการบันทึกcore_config_dataค่า


14

อาจเป็นความคิดที่จะสร้างการเขียนซ้ำสำหรับไซต์นี้ชั่วคราว

Mage_Index_Model_Resource_Process

จากนั้นทำสิ่งที่ชอบ:

<?php

class YourNamespace_YourModule_Model_Resource_Process
    extends Mage_Index_Model_Resource_Process
{

    public function updateStatus($process, $status)
    {
        if ($status === Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX) {
            Mage::log(sprintf('Indexer %s was invalidated.', $process->getIndexer()->getName()), null, 'invalid_index.log', true);
            foreach (debug_backtrace() as $db) {
                Mage::log(sprintf('%s::%s', $db['class'], $db['function']), null, 'invalid_index.log', true);
            }
        }
        return parent::updateStatus($process, $status);
    }

}

ซึ่งควรระบุได้ง่ายเมื่อตัวทำดัชนีได้รับการทำให้ใช้งานไม่ได้และการติดตามการโทรที่รับผิดชอบ


10

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

ดัชนี:รายการเรียงตามตัวอักษรของชื่อเรื่อง ฯลฯ โดยมีการอ้างอิงถึงสถานที่ที่พวกเขาเกิดขึ้นมักจะพบในตอนท้ายของหนังสือ

ดังนั้นดัชนีในแง่ของฐานข้อมูลคืออะไร?

ดัชนีคือโครงสร้างข้อมูลที่เรียงลำดับจำนวนเร็กคอร์ดในฟิลด์หนึ่งฟิลด์หรือมากกว่าและเพิ่มความเร็วในการดึงข้อมูล นี่คือเพื่อหลีกเลี่ยงการสแกนผ่านบล็อกดิสก์ที่ตารางครอบคลุมเมื่อค้นหาผ่านฐานข้อมูล

และการจัดทำดัชนีอะไรในแง่ของวีโอไอพี ? ผลพลอยได้ของ EAV (Entity Attribute Value) AKA เป็นฐานข้อมูลภายในฐานข้อมูล ด้วยตารางการค้นหาหลายตารางการรวบรวมแอ็ตทริบิวต์ทั้งหมดที่ทำเครื่องหมายเป็นดัชนีจะถูกรวมเข้าในตารางเดียวของตารางการค้นหาทั้งหมดเพื่อการสืบค้นที่เร็วขึ้น

ฉันจำได้ว่าเมื่อมีการพัฒนา Magento ในตอนแรกความยืดหยุ่นมีความสำคัญสูงในรายการลำดับความสำคัญซึ่งเป็นที่เข้าใจได้ว่าทำไมพวกเขาถึงเลือกใช้โมเดลข้อมูล EAV ในที่สุดอย่างไรก็ตามค่าใช้จ่ายสำหรับความยืดหยุ่นดังกล่าวมาที่ค่าใช้จ่ายในการปฏิบัติงานและมันได้ทำให้เกิดปัญหา Magento ตั้งแต่เริ่มต้น

โดยทั่วไปแล้ว Magento Engineers ได้รับมอบหมายเป็นอันดับแรกและสำคัญที่สุดด้วยการสร้างระบบที่ยืดหยุ่นปรับแต่งได้มากที่สุดที่เป็นไปได้และกังวลเกี่ยวกับประสิทธิภาพในภายหลัง ทำไมวีโอไอพีจึงช้า

EAV นั้นยอดเยี่ยมสำหรับการจัดเก็บข้อมูล แต่แย่มากสำหรับการทำธุรกรรม แล้วทำไมเราต้องเริ่มต้นด้วยดัชนี? เนื่องจากวิธีการเดียวกันของโมเดลเชิงสัมพันธ์ได้ถูกนำมาใช้ใหม่ตอนนี้ Magento จึงต้องจัดการกับทุกสิ่งที่ MySQL ทำเองภายใน สิ่งที่ต้องพิจารณาเช่นดัชนีที่มีอยู่แล้วในตาราง MySQL เมื่อคำนึงถึงสิ่งนี้แล้วให้พิจารณาโมเดลข้อมูล EAV ทันที:

  • E ntity = ตาราง
  • ttribute = ฟิลด์
  • V alue = ค่า

เช่นเดียวกันจะต้องมีการปรับใช้ใหม่ซึ่งเป็น IMO "รูปแบบการต่อต้าน" มาก

นอกจากนี้เหตุผลเดียวกับที่คุณค้นหาvar/locksที่ใช้ทำดัชนีเพื่อล็อคกระบวนการสร้างดัชนี ฐานข้อมูลเหตุผลเดียวกันมีการล็อคแถว / ตาราง

ตอนนี้เมื่อมีการบันทึกว่ามูลค่าผลิตภัณฑ์ที่ได้รับการเปลี่ยนแปลงflat tableหรือindex(ตามที่ MySQL อ้างถึง) จะต้องได้รับการปรับปรุงเพื่อสะท้อนให้เห็นถึงการสืบค้นสำหรับข้อมูลที่เปลี่ยนแปลงใหม่ที่จะพบได้อย่างรวดเร็วและมีประสิทธิภาพโดยไม่ต้องสแกนผ่านบันทึกจำนวนมาก ตารางแบนมีอยู่ตามที่ใช้ในเหตุผลเดียวกันกับ MySQL โดยไม่มีดัชนี (เช่นหนังสือ) ต้องใช้การสแกนตารางแบบเต็มเพื่อดึงข้อมูล ซึ่งหมายความว่า I / O จำนวนมากสำหรับทั้งดิสก์และหน่วยความจำเช่นเดียวกับรอบ CPU เพื่อค้นหาข้อมูลที่ร้องขอซึ่งไม่ดีสำหรับประสิทธิภาพ

เนื่องจาก Magento ใช้โมเดลข้อมูล EAV จึงมีตารางการค้นหาจำนวนมากที่ต้องสแกนเพื่อรวมข้อมูลทั้งหมดเข้าด้วยกันเพื่อค้นหาข้อมูลที่ถูกร้องขอ นี่คือสิ่งที่เกิดขึ้นหากคุณปิดใช้งานแคตตาล็อกแฟลต เช่นเดียวกับ MySQL สแกนหาเรคคอร์ดโดยใช้ดัชนี (ตารางแบน) เพื่อใช้ในการค้นหาเรคคอร์ดอย่างรวดเร็วในขณะที่รักษารอบ I / O ที่มีค่า การสร้างตารางและไม่เพิ่มดัชนีใด ๆ จะเหมือนกับการไม่ใช้ตารางแบนในวีโอไอพี ในขณะที่สถานการณ์ทั้งสองนี้สามารถทำงานได้ดีในสถานการณ์ที่แตกต่างกันดูที่Ben at Sonassi คำตอบที่ดีมากสำหรับคำถามนี้ (คำแนะนำนี้เกี่ยวข้องกับการทำความเข้าใจขอบเขตข้อมูล)

แม้ว่ามันจะไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรงการทำความเข้าใจชิ้นส่วนที่เคลื่อนไหวและการเตรียมพร้อมที่ดีกว่าสำหรับพวกเขาควรช่วยบรรเทาอาการปวดหัวบางอย่างที่มาพร้อมกับการทำดัชนี " รักษาปัญหามากกว่าอาการ "

การสำรวจเพิ่มเติมภายในของระบบฐานข้อมูลที่ทันสมัยสามารถช่วยให้มีความเข้าใจที่ดีขึ้นเกี่ยวกับวิธีการและดัชนีที่จำเป็นและวิธีการที่เกี่ยวข้อง (ค่อนข้าง) กับการจัดทำดัชนีของวีโอไอพีเช่นกัน

ในการสรุป: ทำความเข้าใจขอบเขตปัญหาของคุณก่อนที่จะใช้วิธีแก้ปัญหาแบบสุ่ม ไม่ใช่ว่าข้อมูลทุกบิตจะเหมือนกันทุกประการและการวางแผนและการนำโซลูชั่นมาใช้หลังจากที่คุณเข้าใจปัญหาได้ดีแล้ว การปรับฐานข้อมูลให้ผลตอบแทนคุ้มค่ามากสำหรับการจัดการการเปลี่ยนแปลง DEADLOCKSเช่นการป้องกันหวั่น

คุณอาจต้องการพิจารณาการตั้งค่าตัวทำดัชนีทั้งหมดของคุณManualและตั้งค่ากระบวนการทางเลือกเพื่อสร้างดัชนีใหม่ในช่วงเวลาที่ไม่มาก (เมื่อผู้ดูแลระบบไม่อยู่) เท่านั้นProduct Pricesและควรจะกำหนดให้Stock StatusUpdate on Save

ตอนนี้ให้พิจารณาว่าการจัดทำดัชนีทำงานอย่างไรจากมุมมองทางเทคนิค Mage_Indexโมดูลหลักเป็นผู้รับผิดชอบสำหรับการทำดัชนี Indexerรูปแบบพื้นฐานของการสร้างดัชนีที่: Process, Event,

Mage_Index_Model_Indexerเป็นตัวทำดัชนีการโต้ตอบทั้งหมดกับโมดูลอื่น ๆ จะMage_Indexเกิดขึ้นผ่านบริการนี้ มันมีวิธีการดังต่อไปนี้:

  • processEntityAction() สร้างและลงทะเบียนเหตุการณ์และเริ่มกระบวนการทำดัชนี
  • logEvent() สร้างกิจกรรมและลงทะเบียนเพื่อสร้างดัชนีในภายหลัง
  • indexEvent() รันเหตุการณ์การจัดทำดัชนี;
  • getProcessesCollection()ส่งคืนคอลเลกชันของกระบวนการทั้งหมดเช่นคุณสมบัติของผลิตภัณฑ์ราคาผลิตภัณฑ์แคตตาล็อก Url Rewrites ฯลฯ โดยปกติหลังจากเปลี่ยนแก่นสำคัญเช่นวิธีการ_afterSaveหรือ_afterCommitเราดำเนินการจัดทำดัชนีบางส่วนใหม่

Mage_Index_Model_Processกระบวนการหรือเป็นสาระสำคัญของดัชนีของคุณที่ร้านค้าสถานะการดำเนินการระยะที่ผ่านมา index_processกระบวนการทั้งหมดจะถูกเก็บไว้ในตาราง โปรแกรมมีเมธอดgetIndexer()ซึ่งส่งคืนดัชนีของโมเดล ภารกิจส่วนใหญ่ที่มอบหมายโดยกระบวนการของแบบจำลองดัชนี

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

รายการทั่วไปเมื่อเกิดความถูกต้อง:

  1. แคตตาล็อก / ผลิตภัณฑ์ (SAVE, DELETE, MASS_ACTION)
  2. แคตตาล็อก / หมวดหมู่ (SAVE, DELETE)
  3. catalog / resource_eav_attribute (SAVE, DELETE)
  4. ลูกค้า / กลุ่ม (ประหยัด)
  5. แคตตาล็อกสินค้าคงคลัง / stock_item (SAVE)
  6. แท็ก / แท็ก (SAVE)
  7. หลัก / ร้านค้า (ประหยัดลบ)
  8. core / store_group (SAVE, DELETE)
  9. หลัก / เว็บไซต์ (SAVE, DELETE)

โมเดลรีซอร์สใด ๆ ที่มีดัชนีที่ลงทะเบียนไว้ในโมดูลconfig.xmlเมื่อบันทึกธุรกรรม afterCommitCallback()ถูกเรียกด้วยคำนำหน้า นี่คือที่ที่เหตุการณ์ดัชนีถูกบันทึกเนื่องจากเป็นตอนท้ายของธุรกรรมที่ประสบความสำเร็จ

... และมันทำให้ฉันเสียใจที่ EAV ยังอยู่ใน Magento 2 :(

อ้างอิง:


1
merch.docs.magento.com/ee/user_guide/system-operations/…ดู "กิจกรรมที่ทำดัชนีการทริกเกอร์ใหม่"
B00MER
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.