วิธีการจัดทำดัชนีในวีโอไอพี


30
  1. การจัดทำดัชนีทำงานใน Magento อย่างไร
  2. มันทำอะไรกันแน่?
  3. ทำไมถึงต้องมี?

ลิงค์นี้: stackoverflow.com/questions/4945307/…จะช่วยคุณได้
TBI Infotech

นี่คือวิธีและกระบวนการใน Magento 2 magento.stackexchange.com/questions/90510/…
Yogesh Trivedi

คุณใช้ Magento รุ่นใด มีการเปลี่ยนแปลงค่อนข้างมากใน v1.13 - ดังนั้นคาดว่าจะมีความแตกต่างในเวอร์ชั่นก่อนหน้าของเวอร์ชั่นนั้น นี่คือโพสต์บล็อกที่ดีอธิบายโมดูล mView และการจัดทำดัชนีในเวอร์ชัน 1.13 ของ Magento: eschrade.com/page/…
Pitt

คำตอบ:


63

มีดัชนีชนิดต่าง ๆ ใน Magento
ตัวจัดทำดัชนีทั้งหมดอยู่ที่นั่นเพื่อทำให้สิ่งต่าง ๆ ทำงานได้เร็วขึ้น
ฉันจะครอบคลุมที่นี่เพียงไม่กี่คน

ดัชนี
คงที่มี 2 ดัชนีดังกล่าว หนึ่งสำหรับหมวดหมู่และอีกหนึ่งสำหรับผลิตภัณฑ์
ตามค่าเริ่มต้นหมวดหมู่และเอนทิตีผลิตภัณฑ์ (และลูกค้าและที่อยู่ลูกค้า แต่ไม่สำคัญในสถานการณ์นี้) เป็นเอนทิตีEAV นี่เป็นสิ่งที่ดีมากสำหรับการเพิ่มความสามารถ แต่มันเป็นนักฆ่าประสิทธิภาพเพราะเพื่อให้ได้รับค่าทั้งหมดสำหรับคุณลักษณะทั้งหมดที่คุณต้องการจำนวนมากเข้าร่วมหรือหลายแบบสอบถาม
นี่คือที่ซึ่งตัวสร้างดัชนีแบนเข้ามาเล่น
มันแปลงโครงสร้าง EAV เป็นโครงสร้างแบบแบน ฉันหมายความว่ามันสร้างตาราง (หนึ่งสำหรับแต่ละมุมมองร้านค้าใน Magento) ที่มีหนึ่งคอลัมน์ที่สอดคล้องกับแอตทริบิวต์ ทำให้การเลือกเร็วขึ้น สำหรับหมวดหมู่คุณลักษณะทั้งหมดจะถูกแปลงเป็นคอลัมน์ตาราง สำหรับผลิตภัณฑ์เฉพาะรายการที่คุณทำเครื่องหมายว่า 'ใช้ในรายการผลิตภัณฑ์' เนื่องจากคุณสามารถขายผลิตภัณฑ์ทุกประเภทที่มีคุณลักษณะที่แตกต่างกันและการสร้างตารางหนึ่งด้วยคอลัมน์ gazillion อาจไม่สามารถทำได้
นอกจากนี้ผลิตภัณฑ์บางอย่างอาจถูกปิดใช้งานหรืออาจไม่ได้อยู่ในเว็บไซต์บางแห่งและไม่จำเป็นต้องรวมไว้ในรายการเพื่อค้นหา สิ่งเหล่านี้จะถูกยกเว้นโดยตัวจัดทำดัชนี
ตารางแบนที่สร้างขึ้นจะใช้สำหรับการอ่านข้อมูลใน fronend ส่วนแบ็คเอนด์ยังคงใช้โครงสร้าง EAV

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

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

แคตตาล็อก url Rewrites
สิ่งนี้จะทำความสะอาดกฎการเขียน url ใหม่โดยการตั้งค่าว่า url ใดสอดคล้องกับผลิตภัณฑ์หรือหมวดหมู่ใด วิธีนี้ง่ายกว่าสำหรับระบบภายในของการจัดการ URL เพื่อตัดสินใจว่าควรดูหน้าใดเมื่อเรียก URL ที่ไม่ได้มาตรฐาน แทนที่จะค้นหาคีย์ผลิตภัณฑ์และหมวดหมู่ URL ทั้งหมดจะค้นหาในตารางเดียว

ผลิตภัณฑ์หมวดหมู่
ในวีโอไอพีคุณสามารถตั้งค่าแอตทริบิวต์หมวดหมู่ที่ชื่อว่า 'Is Anchor' เป็นจริงหรือเท็จ หากเป็นจริงก็หมายความว่าหมวดหมู่ที่เป็นปัญหาจะแสดงรายการผลิตภัณฑ์ทั้งหมดจากหมวดหมู่ย่อย อีกครั้งการพิจารณาเรียลไทม์นี้จะใช้ทรัพยากรมากกว่าเพียงแค่อ่านหนึ่งตาราง ตัวสร้างดัชนีนี้สร้างการเชื่อมโยงระหว่างผลิตภัณฑ์และหมวดหมู่ตามการเชื่อมโยงที่คุณตั้งไว้ในส่วนหลังและการตั้งค่าสถานะ 'Is Anchor' ในหมวดหมู่

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

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

การรวมแท็ก
ฉันไม่รู้ว่ามันทำอะไร ฉันไม่เคยใช้แท็กในโครงการสดจริง


ขอบคุณ marius นี่เป็นคำตอบที่ดีที่สุด ... ฉันได้
Sonam

คุณหมายถึงอะไรเมื่อคุณพูดว่าตารางแบนจะใช้เฉพาะในส่วนหน้า (และส่วนหลังยังคงใช้โครงสร้าง EAV) ฉันเป็นมือใหม่และจากสิ่งที่ฉันเข้าใจเมื่อเราสร้าง / อัปเดตเอนทิตีเช่นผลิตภัณฑ์มันยังคงใช้ตาราง EAV เพื่อดำเนินการเหล่านี้และเราจะตั้งค่าตัวเลือกในการอัปเดตตารางแบนตามการบันทึกหรืออัปเดตด้วยตนเอง การเปลี่ยนแปลงเหล่านี้จะปรากฏในตารางแบน คุณหมายถึงกระบวนการนี้เมื่อคุณพูดอย่างนั้นเหรอ? คุณช่วยอธิบายเรื่องนี้ได้มั้ย ขอบคุณ!
Bharadwaj Srigiriraju

1
@Marius: ในระหว่างการจัดทำดัชนีใหม่ฉันได้รับข้อผิดพลาดเต็มรูปแบบของตาราง กรุณาช่วย. ข้อผิดพลาดที่ฉันได้รับคือตาราง 'catalog_product_index_price_bundle_sel_tmp' เต็ม
zed Blackbeard

1
@Marius หลังจาก 3 ปีของคำตอบตอนนี้คุณมีความคิดเกี่ยวกับการรวมแท็กหรือไม่มันเกี่ยวข้องกับแท็กผลิตภัณฑ์หรือไม่
Murtuza Zabuawala

1
@Black คุณมี 2 การตั้งค่าสำหรับดัชนี "อัปเดตเมื่อบันทึก" และ "คู่มือ" สำหรับการอัปเดตเกี่ยวกับการบันทึกทุกอย่างจะเกิดขึ้นโดยอัตโนมัติเมื่อคุณบันทึกผลิตภัณฑ์ แต่นี่อาจทำให้เกิดปัญหาประสิทธิภาพ ตัวอย่างเช่นหากคุณเปลี่ยนผลิตภัณฑ์หลายรายการพร้อมกัน สำหรับโหมดแมนนวลจะไม่มีการทำดัชนีการทำดัชนีใหม่หลังจากบันทึก แต่คุณต้องสร้างใหม่ด้วยตนเองเมื่อคุณทำเสร็จแล้ว
Marius

11

ไม่สามารถรับเครดิตสำหรับสิ่งนี้เนื่องจากนำมาจากโพสต์ต้นฉบับที่: https://stackoverflow.com/questions/4945307/can-someone-explain-magentos-indexing-feature-in-detail

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

ในฐานข้อมูล MySQL "ทั่วไป" ที่มากขึ้นตารางสำหรับจัดเก็บผลิตภัณฑ์แคตตาล็อกจะมีโครงสร้างดังนี้:

PRODUCT:
    product_id INT
    sku        VARCHAR
    name       VARCHAR
    size       VARCHAR
    longdesc   VARCHAR
    shortdesc  VARCHAR
    ... etc ...

สิ่งนี้รวดเร็วสำหรับการดึงข้อมูล แต่ทำให้เกิดปัญหาพื้นฐานสำหรับซอฟต์แวร์อีคอมเมิร์ซชิ้นหนึ่ง: คุณจะทำอย่างไรเมื่อคุณต้องการเพิ่มคุณสมบัติเพิ่มเติม? ถ้าคุณขายของเล่นและแทนที่จะเป็นคอลัมน์ขนาดคุณต้องมี age_range คุณสามารถเพิ่มคอลัมน์อื่นได้ แต่ควรชัดเจนว่าในร้านค้าขนาดใหญ่ (คิดว่า Walmart เป็นต้น) สิ่งนี้จะส่งผลให้แถวที่ว่างเปล่า 90% และพยายามบำรุงรักษาแอตทริบิวต์ใหม่นั้นเป็นไปไม่ได้

เพื่อต่อสู้กับปัญหานี้วีโอไอพีจึงแยกตารางออกเป็นหน่วยย่อย ๆ ฉันไม่ต้องการสร้างระบบ EAV ใหม่ทั้งหมดในคำตอบนี้ดังนั้นโปรดยอมรับรูปแบบที่เรียบง่ายนี้:

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

ตอนนี้เป็นไปได้ที่จะเพิ่มคุณสมบัติตามที่ต้องการโดยป้อนค่าใหม่ลงใน product_attributes แล้วใส่บันทึกที่อยู่ติดกันใน product_attribute_values นี่เป็นสิ่งที่วีโอไอพีทำ (ด้วยความเคารพเล็กน้อยสำหรับประเภทข้อมูลกว่าที่ฉันแสดงที่นี่) ที่จริงแล้วตอนนี้ไม่มีเหตุผลที่สินค้าสองรายการจะมีฟิลด์เหมือนกันเลยดังนั้นเราจึงสามารถสร้างประเภทผลิตภัณฑ์ทั้งหมดด้วยชุดคุณลักษณะที่แตกต่างกัน!

อย่างไรก็ตามความยืดหยุ่นนี้มาพร้อมกับราคา ถ้าฉันต้องการหาสีของเสื้อในระบบของฉัน (เป็นตัวอย่างเล็กน้อย) ฉันต้องค้นหา:

  1. product_id ของรายการ (ในตารางผลิตภัณฑ์)
  2. attribute_id สำหรับสี (ในตารางแอตทริบิวต์)
  3. สุดท้ายคือมูลค่าจริง (ในตาราง attribute_values)

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

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

หวังว่าจะอธิบายสิ่งต่าง ๆ เล็กน้อย!


nuke it from space, nice :)
Wietse

5

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

ตามค่าเริ่มต้นระบบหลักจะอัพเดตดัชนีในการบันทึกของแต่ละรายการ แต่ในบางกรณีคุณจำเป็นต้องทำด้วยตนเองเช่นบางประเภทแอ็คชั่นจำนวนมาก ฯลฯ คุณสามารถอัพเดตดัชนีได้ตลอดเวลาจากแบ็กเอนด์ผู้ดูแลระบบ (Admin-> ระบบ -> การจัดการดัชนี) แต่บางครั้งก็ทำให้เกิดปัญหา

ตัวอย่างเช่นหากคุณมีผลิตภัณฑ์ 10k + และหมวดหมู่จำนวนมากการสร้างดัชนีใหม่ 'แคตตาล็อก url rewrite' อาจใช้เวลาหลายชั่วโมง จากนั้นสคริปต์ PHP สามารถหยุดพักได้เนื่องจากเกิน max_execution_time มีวิธีแก้ไขปัญหาต่าง ๆ โดยการเรียกใช้กระบวนการ reindex จากบรรทัดคำสั่ง

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