เนื่องจากคนอื่นได้ตอบคำถามของคุณโดยเฉพาะแล้ว ฉันคิดว่ามันอาจจะดีกว่าที่จะอธิบายว่าทำไมการจัดทำดัชนีจึงเป็นสิ่งจำเป็นและเกี่ยวข้องกับวีโอไอพีและความสัมพันธ์กับฐานข้อมูลสมัยใหม่อย่างไร
ดัชนี:รายการเรียงตามตัวอักษรของชื่อเรื่อง ฯลฯ โดยมีการอ้างอิงถึงสถานที่ที่พวกเขาเกิดขึ้นมักจะพบในตอนท้ายของหนังสือ
ดังนั้นดัชนีในแง่ของฐานข้อมูลคืออะไร?
ดัชนีคือโครงสร้างข้อมูลที่เรียงลำดับจำนวนเร็กคอร์ดในฟิลด์หนึ่งฟิลด์หรือมากกว่าและเพิ่มความเร็วในการดึงข้อมูล นี่คือเพื่อหลีกเลี่ยงการสแกนผ่านบล็อกดิสก์ที่ตารางครอบคลุมเมื่อค้นหาผ่านฐานข้อมูล
และการจัดทำดัชนีอะไรในแง่ของวีโอไอพี ? ผลพลอยได้ของ 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 Status
Update 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 ที่มีวิญญาณและการกระทำที่เราดำเนินการกับสารนี้
รายการทั่วไปเมื่อเกิดความถูกต้อง:
- แคตตาล็อก / ผลิตภัณฑ์ (SAVE, DELETE, MASS_ACTION)
- แคตตาล็อก / หมวดหมู่ (SAVE, DELETE)
- catalog / resource_eav_attribute (SAVE, DELETE)
- ลูกค้า / กลุ่ม (ประหยัด)
- แคตตาล็อกสินค้าคงคลัง / stock_item (SAVE)
- แท็ก / แท็ก (SAVE)
- หลัก / ร้านค้า (ประหยัดลบ)
- core / store_group (SAVE, DELETE)
- หลัก / เว็บไซต์ (SAVE, DELETE)
โมเดลรีซอร์สใด ๆ ที่มีดัชนีที่ลงทะเบียนไว้ในโมดูลconfig.xml
เมื่อบันทึกธุรกรรม afterCommitCallback()
ถูกเรียกด้วยคำนำหน้า นี่คือที่ที่เหตุการณ์ดัชนีถูกบันทึกเนื่องจากเป็นตอนท้ายของธุรกรรมที่ประสบความสำเร็จ
... และมันทำให้ฉันเสียใจที่ EAV ยังอยู่ใน Magento 2 :(
อ้างอิง: