کند شدن فرآیند تسویه حساب در Magento 2: قاتل جدول Quote
فروشگاه Magento 2 شما یک قاتل خاموش برای عملکرد سیستم دارد. این قاتل در پایگاه داده شما زندگی میکند.
جداول quote و quote_item هر بار که مشتری محصولی را به سبد خرید اضافه میکند، بزرگتر میشوند. اگر خرید انجام نشود، آن رکورد باقی میماند. طی ماهها، تعداد ردیفهای این جداول به میلیونها میرسد.
من زمانی فروشگاهی را دیدم که جدول quote آن ۱۵ میلیون ردیف داشت. سرعت تسویه حساب از ۱.۲ ثانیه به ۸ ثانیه کاهش یافته بود. فروشنده هیچ ایدهای نداشت که چرا این اتفاق میافتد. فرانتاند کش شده بود، بنابراین همه چیز خوب به نظر میرسید تا زمانی که فرآیند تسویه حساب با خطا مواجه میشد.
جداول بزرگ quote باعث بروز این مشکلات میشوند:
- بارگذاری کند صفحه سبد خرید به دلیل Joinهای سنگین در پایگاه داده.
- کند شدن فراخوانیهای AJAX در مرحله تسویه حساب برای محاسبه هزینه حملونقل و مجموع قیمت.
- کند شدن فرآیند ایجاد سفارش در پنل مدیریت.
- طولانیتر شدن زمان پشتیبانگیری (Backup) و بازیابی (Recovery) پایگاه داده.
- فشار بالای حافظه (Memory) بر روی PHP-FPM.
چگونه آن را رفع کنیم:
۱. میزان آسیب را بسنجید
تعداد ردیفها و اندازه جداول خود را بررسی کنید. به دنبال تعداد stale_inactive بگردید. اینها سبدهای خرید رها شدهای هستند که بیش از ۳۰ روز از عمر آنها گذشته است. آنها هیچ کاربردی ندارند و فقط باعث کند شدن کوئریهای شما میشوند.
۲. قبل از حذف، آرشیو کنید
میلیونها ردیف را یکباره حذف نکنید. این کار باعث قفل شدن (Lock) جداول و از کار افتادن پایگاه داده شما میشود. ابتدا جداول آرشیو بسازید و quoteهای غیرفعال که بیش از ۹۰ روز از آنها گذشته است را به آنها منتقل کنید.
۳. از حذف دستهای (Batched Deletes) استفاده کنید
ردیفها را در دستههای کوچک ۱۰,۰۰۰ تایی حذف کنید. این کار از قفل شدن طولانیمدت جداول جلوگیری میکند. همیشه برای رعایت روابط کلید خارجی (Foreign Key)، ابتدا جداول فرزند (Child Tables) را حذف کنید. ترتیب باید به این صورت باشد:
quote_item_optionquote_address_itemquote_shipping_ratequote_paymentquote_addressquote_itemquote
۴. بهینهسازی و ایندکسگذاری
دستور OPTIMIZE TABLE را اجرا کنید تا فضای دیسک آزاد شود. ایندکسهای ترکیبی (Composite Indexes) اضافه کنید تا به پایگاه داده کمک کنید quoteهای فعال را سریعتر پیدا کند. به عنوان مثال، یک ایندکس روی (is_active, updated_at) اضافه کنید.
۵. پاکسازی را خودکار کنید
از دستور Magento CLI استفاده کنید: bin/magento sales:cleanQuotes.
یک cron job تنظیم کنید تا این دستور را به صورت هفتگی در زمانهای کمترافیک اجرا کند.
نکته حرفهای: سبدهای خرید مهمان (Guest carts) بیشترین حجم اضافی را ایجاد میکنند. در تنظیمات خود، طول عمر guest quote را به ۷ روز کاهش دهید. این کار باعث میشود پایگاه داده شما بدون آسیب رساندن به مشتریان واقعی، سبک و بهینه باقی بماند.
یکی از مشتریان با استفاده از این مراحل، زمان بارگذاری تسویه حساب خود را از ۶.۵ ثانیه به ۱.۴ ثانیه کاهش داد. آنها همچنین ۹ گیگابایت از فضای پایگاه داده خود را آزاد کردند.
جداول quote خود را کوچک نگه دارید تا نرخ تبدیل (Conversion Rate) بالایی داشته باشید.
