تباطؤ عملية الدفع في Magento 2: القاتل الصامت لجدول الاقتباسات (Quote Table)

متجرك على Magento 2 يحتوي على قاتل صامت للأداء، وهو يعيش داخل قاعدة بياناتك.

تنمو جداول quote و quote_item في كل مرة يضيف فيها العميل منتجًا إلى عربة التسوق. وإذا لم يتم الشراء، يظل السجل موجودًا. ومع مرور الأشهر، تصل هذه الجداول إلى ملايين الصفوف.

رأيت ذات مرة متجرًا يحتوي على 15 مليون صف في جدول quote. انخفضت سرعة عملية الدفع من 1.2 ثانية إلى 8 ثوانٍ. لم يكن التاجر يعرف السبب؛ كانت الواجهة الأمامية (frontend) مخزنة مؤقتًا (cached)، لذا بدا كل شيء على ما يرام حتى فشلت عملية الدفع.

تسبب جداول الاقتباسات الكبيرة هذه المشكلات:

  • بطء تحميل صفحة عربة التسوق بسبب عمليات الربط (joins) الثقيلة في قاعدة البيانات.
  • بطء استدعاءات AJAX لعملية الدفع الخاصة بالشحن والإجماليات.
  • بطء إنشاء الطلبات من لوحة التحكم (admin).
  • زيادة وقت النسخ الاحتياطي واستعادة قاعدة البيانات.
  • ضغط عالٍ على الذاكرة في PHP-FPM.

كيفية الإصلاح:

1. قياس حجم الضرر تحقق من عدد الصفوف وأحجام الجداول. ابحث عن عدد stale_inactive. هذه هي عربات التسوق المهجورة التي مر عليها أكثر من 30 يومًا، وهي لا تخدم أي غرض سوى إبطاء استعلاماتك (queries).

2. الأرشفة قبل الحذف لا تحذف ملايين الصفوف دفعة واحدة، فهذا سيؤدي إلى قفل الجداول (lock) وانهيار قاعدة البيانات. أولاً، قم بإنشاء جداول أرشفة وانقل الاقتباسات غير النشطة التي مر عليها أكثر من 90 يومًا إليها.

3. استخدام الحذف على دفعات احذف الصفوف في مجموعات صغيرة مكونة من 10,000 صف. هذا يمنع عمليات قفل الجداول الطويلة. احذف دائمًا الجداول التابعة (child tables) أولاً لاحترام علاقات المفاتيح الخارجية (foreign key relationships). يجب أن يكون الترتيب كالتالي:

  • quote_item_option
  • quote_address_item
  • quote_shipping_rate
  • quote_payment
  • quote_address
  • quote_item
  • quote

4. التحسين والفهرسة قم بتشغيل OPTIMIZE TABLE لاستعادة مساحة القرص. أضف فهارس مركبة (composite indexes) لمساعدة قاعدة البيانات في العثور على الاقتباسات النشطة بشكل أسرع. على سبيل المثال، أضف فهرسًا على (is_active, updated_at).

5. أتمتة عملية التنظيف استخدم أمر Magento CLI التالي: bin/magento sales:cleanQuotes. قم بإعداد مهمة مجدولة (cron job) لتشغيل هذا الأمر أسبوعيًا خلال أوقات انخفاض حركة المرور.

نصيحة احترافية: تسبب عربات التسوق الخاصة بالزوار (Guest carts) أكبر قدر من التضخم. قم بتقليل عمر اقتباس الزائر إلى 7 أيام في الإعدادات الخاصة بك. هذا يحافظ على رشاقة قاعدة بياناتك دون الإضرار بالعملاء الحقيقيين.

شهد أحد العملاء انخفاض وقت تحميل عملية الدفع من 6.5 ثانية إلى 1.4 ثانية باستخدام هذه الخطوات، كما استعادوا 9 جيجابايت من مساحة قاعدة البيانات.

حافظ على صغر حجم جداول الاقتباسات لضمان بقاء معدلات التحويل (conversion rates) مرتفعة.

المصدر: https://dev.to/magevanta/magento-2-quote-table-optimization-scaling-checkout-with-millions-of-abandoned-carts-4pmp