Magento 2 Checkout ทำงานช้าลง: ตัวการร้ายจากตาราง Quote

ร้านค้า Magento 2 ของคุณมีตัวการร้ายที่ทำลายประสิทธิภาพการทำงานอย่างเงียบเชียบ และมันอยู่ในฐานข้อมูลของคุณนั่นเอง

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

ผมเคยเห็นร้านค้าหนึ่งที่มีข้อมูลในตาราง quote ถึง 15 ล้านแถว ความเร็วในการชำระเงิน (Checkout) ลดลงจาก 1.2 วินาที เหลือถึง 8 วินาที โดยที่เจ้าของร้านไม่ทราบเลยว่าเกิดจากอะไร เนื่องจากหน้าบ้าน (Frontend) มีการทำ Cache ไว้ ทุกอย่างจึงดูปกติดีจนกระทั่งขั้นตอนการชำระเงินล้มเหลว

ตาราง quote ขนาดใหญ่ก่อให้เกิดปัญหาเหล่านี้:

  • หน้าตะกร้าสินค้าโหลดช้าเนื่องจากการทำ Database Join ที่หนักเกินไป
  • การเรียกใช้ AJAX ในขั้นตอนชำระเงินเพื่อคำนวณค่าจัดส่งและยอดรวมล่าช้า
  • การสร้างคำสั่งซื้อผ่านระบบ Admin ช้าลง
  • การสำรองข้อมูล (Backup) และการกู้คืน (Recovery) ฐานข้อมูลใช้เวลานานขึ้น
  • เกิดภาระการใช้หน่วยความจำ (Memory pressure) สูงใน PHP-FPM

วิธีแก้ไข:

  1. วัดระดับความเสียหาย ตรวจสอบจำนวนแถวและขนาดของตาราง มองหาจำนวน stale_inactive ซึ่งก็คือรถเข็นที่ถูกทิ้งไว้ (Abandoned carts) ที่มีอายุมากกว่า 30 วัน ข้อมูลเหล่านี้ไม่มีประโยชน์ใดๆ นอกจากจะทำให้การ Query ของคุณช้าลง

  2. ทำการ Archive ก่อนลบ อย่าลบข้อมูลหลายล้านแถวในคราวเดียว เพราะจะทำให้ตารางถูก Lock และฐานข้อมูลอาจล่มได้ ขั้นแรก ให้สร้างตารางสำหรับเก็บข้อมูลย้อนหลัง (Archive tables) แล้วย้ายข้อมูล quote ที่ไม่มีการเคลื่อนไหว (Inactive) ซึ่งมีอายุมากกว่า 90 วันเข้าไปไว้ในนั้น

  3. ใช้การลบแบบแบ่งเป็นชุด (Batched deletes) ลบข้อมูลทีละน้อย เช่น ชุดละ 10,000 แถว เพื่อป้องกันการเกิด Table Lock เป็นเวลานาน และต้องลบตารางลูก (Child tables) ก่อนเสมอเพื่อรักษาความสัมพันธ์ของ Foreign Key โดยควรเรียงลำดับดังนี้:

  • quote_item_option
  • quote_address_item
  • quote_shipping_rate
  • quote_payment
  • quote_address
  • quote_item
  • quote
  1. ปรับแต่งและทำ Index รันคำสั่ง OPTIMIZE TABLE เพื่อคืนพื้นที่ดิสก์ และเพิ่ม Composite Indexes เพื่อช่วยให้ฐานข้อมูลค้นหา quote ที่ยังใช้งานอยู่ได้เร็วขึ้น ตัวอย่างเช่น เพิ่ม index ในคอลัมน์ (is_active, updated_at)

  2. ตั้งค่าการทำความสะอาดแบบอัตโนมัติ ใช้คำสั่ง Magento CLI: bin/magento sales:cleanQuotes และตั้งค่า Cron job ให้ทำงานสัปดาห์ละครั้งในช่วงที่มีผู้ใช้งานน้อย

เคล็ดลับมือโปร: รถเข็นของลูกค้าที่ไม่ได้ล็อกอิน (Guest carts) คือตัวการที่ทำให้ข้อมูลบวมที่สุด ให้ลดอายุการใช้งานของ Guest quote ลงเหลือ 7 วันในการตั้งค่า วิธีนี้จะช่วยให้ฐานข้อมูลของคุณเบาขึ้นโดยไม่ส่งผลกระทบต่อลูกค้าตัวจริง

ลูกค้ารายหนึ่งสามารถลดเวลาโหลดหน้าชำระเงินจาก 6.5 วินาที เหลือเพียง 1.4 วินาทีด้วยวิธีเหล่านี้ และยังได้พื้นที่ฐานข้อมูลคืนมาถึง 9GB

รักษาตาราง quote ให้มีขนาดเล็ก เพื่อรักษาอัตราการเปลี่ยนเป็นยอดขาย (Conversion rates) ให้สูงอยู่เสมอ

Source: https://dev.to/magevanta/magento-2-quote-table-optimization-scaling-checkout-with-millions-of-abandoned-carts-4pmp