ภาษี EAV: ทำไมการโหลดข้อมูลสินค้าใน Magento ถึงช้า
ผู้ใช้งาน Magento มักจะบ่นเรื่องความเร็ว ผู้ใช้งานจำนวนมากกำลังจ่าย "ภาษี EAV" โดยที่ไม่รู้ตัว
สินค้าหนึ่งชิ้นใน Magento ไม่ได้เก็บอยู่ในแถวเดียว แต่มันคือกลุ่มของแถวที่กระจายอยู่ตามตารางต่างๆ ตารางหนึ่งจะเก็บคอลัมน์แบบคงที่ (static columns) ในขณะที่ตารางอื่นๆ จะเก็บข้อมูลประเภทเฉพาะ เช่น varchar, int, decimal, text และ datetime
ในการโหลดสินค้าหนึ่งชิ้น Magento จะต้องอ่านข้อมูลจากทุกตารางเหล่านี้ จากนั้นจึงนำข้อมูลมาประกอบกลับเข้าด้วยกันเป็น object หากคุณเพิ่ม store view เข้าไป ภาระงานก็จะเพิ่มขึ้นเป็นสองเท่า
กับดักที่ใหญ่ที่สุดคือการใช้ addAttributeToSelect('*')
เครื่องหมายดอกจัน (*) หมายความว่าคุณกำลังโหลดทุก attribute หากหน้าหมวดหมู่ (category page) แสดงสินค้า 36 ชิ้น ซึ่งอาจต้องการเพียงแค่ 6 ฟิลด์ เช่น name และ price แต่ถ้าคุณใช้เครื่องหมายดอกจัน คุณกลับต้องโหลดถึง 60 ฟิลด์ Magento ต้องอ่าน, join และประมวลผลฟิลด์ส่วนเกินอีก 54 ฟิลด์ เพียงเพื่อที่จะทิ้งพวกมันไปในภายหลัง
คุณสามารถแก้ไขเรื่องนี้ได้ภายใน 5 นาที
เลิกใช้เครื่องหมายดอกจัน แล้วระบุคอลัมน์ที่คุณต้องการให้ชัดเจน:
- name
- price
- small_image
- url_key
- status
- visibility
การเปลี่ยนแปลงนี้คือวิธีที่เห็นผลชัดเจนที่สุดสำหรับหน้าแสดงรายการสินค้า (listing pages) ที่ทำงานช้า
สำหรับการแก้ไขที่ลึกกว่านั้น อย่าประกอบสินค้าใหม่จาก EAV ในหน้าแสดงรายการสินค้า หน้าหมวดหมู่และระบบค้นหาควรจะอ่านข้อมูลจาก index tables และ OpenSearch ซึ่ง Magento ได้จัดเตรียม index เหล่านี้ไว้ให้คุณแล้ว หน้าหมวดหมู่ที่ทำงานเร็วจะอาศัย index เหล่านี้ และจะเข้าไปแตะต้อง EAV เฉพาะ attribute เพียงไม่กี่ตัวที่ template ต้องแสดงผลเท่านั้น
อย่าใช้ฟีเจอร์ flat catalog เนื่องจาก Adobe ได้ยกเลิกการใช้งาน (deprecated) ไปแล้ว เพราะมันจะทำงานผิดพลาดเมื่อคุณมี attribute จำนวนมาก อีกทั้งยังเพิ่มภาระในการทำ indexing อย่างหนักและทำให้ติดขีดจำกัดจำนวนคอลัมน์ของ MySQL
ปฏิบัติตามกฎเหล่านี้เพื่อประสิทธิภาพที่ดีขึ้น:
- เลือกเฉพาะ attribute ที่ระบุชื่อไว้เท่านั้น ห้ามใช้เครื่องหมายดอกจันใน collection ที่ต้องแสดงผลให้ผู้ใช้เห็น
- ใช้ OpenSearch สำหรับการแสดงรายการและการกรองข้อมูล (filtering)
- สำหรับการส่งออกข้อมูลจำนวนมาก (bulk exports) ให้ใช้ keyset pagination โดยอ้างอิงจาก entity_id
- เลือกเฉพาะฟิลด์ที่จำเป็นสำหรับการส่งออกข้อมูลเท่านั้น
วัดผลลัพธ์ของคุณด้วยการเปิด query log หากหน้าหมวดหมู่เพียงหน้าเดียวมีการเรียกใช้ query เป็นร้อยๆ ครั้ง แสดงว่าการประกอบข้อมูล EAV คือสาเหตุ ตอนนี้คุณรู้วิธีหาบรรทัดของโค้ดที่เป็นต้นเหตุของปัญหาแล้ว
Source: https://dev.to/iamrobindhiman/the-eav-tax-why-magento-product-loads-are-slow-117h
