Magento 2 চেকআউট স্লোডাউন: কোট টেবিলের মারাত্মক প্রভাব

আপনার Magento 2 স্টোরে একটি নীরব পারফরম্যান্স কিলার রয়েছে। এটি আপনার ডাটাবেসে অবস্থান করছে।

প্রতিবার যখন একজন গ্রাহক কার্টে কোনো পণ্য যোগ করেন, তখন quote এবং quote_item টেবিলগুলো বড় হতে থাকে। যদি তারা পণ্যটি না কেনেন, তবুও সেই রেকর্ডটি থেকে যায়। কয়েক মাস পর, এই টেবিলগুলোতে লক্ষ লক্ষ রো (row) জমা হয়ে যায়।

আমি একবার একটি স্টোর দেখেছি যার quote টেবিলে ১৫ মিলিয়ন রো ছিল। চেকআউট স্পিড ১.২ সেকেন্ড থেকে কমে ৮ সেকেন্ড হয়ে গিয়েছিল। মার্চেন্ট জানতেনই না কেন এমন হচ্ছে। ফ্রন্টএন্ড ক্যাশ করা ছিল, তাই চেকআউট ফেইল না হওয়া পর্যন্ত সবকিছু ঠিকঠাকই মনে হচ্ছিল।

বড় কোট টেবিলগুলো এই সমস্যাগুলো তৈরি করে:

  • ভারী ডাটাবেস জয়েন (joins)-এর কারণে কার্ট পেজ লোড হতে দেরি হওয়া।
  • শিপিং এবং টোটালের জন্য স্লো চেকআউট AJAX কল।
  • অ্যাডমিন প্যানেলে অর্ডার তৈরি করতে বেশি সময় লাগা।
  • ডাটাবেস ব্যাকআপ এবং রিকভারি করতে বেশি সময় লাগা।
  • PHP-FPM-এর ওপর অতিরিক্ত মেমরি প্রেসার।

এটি কীভাবে সমাধান করবেন:

  1. ক্ষতির পরিমাণ পরিমাপ করুন আপনার রো কাউন্ট (row count) এবং টেবিলের সাইজ পরীক্ষা করুন। stale_inactive কাউন্টটি দেখুন। এগুলো হলো ৩০ দিনের বেশি পুরনো পরিত্যক্ত কার্ট (abandoned carts)। এগুলো কোনো কাজে আসে না, বরং আপনার কুয়েরিগুলোকে স্লো করে দেয়।

  2. ডিলিট করার আগে আর্কাইভ করুন একবারে লক্ষ লক্ষ রো ডিলিট করবেন না। এতে আপনার টেবিলগুলো লক হয়ে যাবে এবং ডাটাবেস ক্র্যাশ করতে পারে। প্রথমে আর্কাইভ টেবিল তৈরি করুন এবং ৯০ দিনের বেশি পুরনো ইনঅ্যাক্টিভ কোটগুলোকে সেগুলোতে সরিয়ে নিন।

  3. ব্যাচড ডিলিট (batched deletes) ব্যবহার করুন ১০,০০০ করে ছোট ছোট চাঙ্কে (chunks) রো ডিলিট করুন। এটি দীর্ঘস্থায়ী টেবিল লক হওয়া রোধ করে। ফরেন কি (foreign key) রিলেশনশিপ বজায় রাখতে সবসময় প্রথমে চাইল্ড টেবিলগুলো ডিলিট করুন। ক্রমটি হওয়া উচিত:

  • quote_item_option
  • quote_address_item
  • quote_shipping_rate
  • quote_payment
  • quote_address
  • quote_item
  • quote
  1. অপ্টিমাইজ এবং ইনডেক্স করুন ডিস্ক স্পেস খালি করতে OPTIMIZE TABLE কমান্ড চালান। ডাটাবেস যাতে দ্রুত অ্যাক্টিভ কোটগুলো খুঁজে পায়, সেজন্য কম্পোজিট ইনডেক্স (composite indexes) যোগ করুন। উদাহরণস্বরূপ, (is_active, updated_at)-এর ওপর একটি ইনডেক্স যোগ করুন।

  2. ক্লিনআপ অটোমেট করুন Magento CLI কমান্ড ব্যবহার করুন: bin/magento sales:cleanQuotes। ট্রাফিক কম থাকে এমন সময়ে প্রতি সপ্তাহে এটি চালানোর জন্য একটি ক্রন জব (cron job) সেট আপ করুন।

Pro Tip: গেস্ট কার্টগুলো সবচেয়ে বেশি অপ্রয়োজনীয় ডাটা জমিয়ে রাখে। আপনার কনফিগারেশনে গেস্ট কোটের লাইফটাইম কমিয়ে ৭ দিন করে দিন। এটি আসল গ্রাহকদের কোনো ক্ষতি না করেই আপনার ডাটাবেসকে হালকা রাখবে।

এই ধাপগুলো অনুসরণ করে একজন ক্লায়েন্ট তাদের চেকআউট লোড টাইম ৬.৫ সেকেন্ড থেকে কমিয়ে ১.৪ সেকেন্ডে নিয়ে আসতে পেরেছেন। তারা ৯ জিবি ডাটাবেস স্পেসও উদ্ধার করেছেন।

আপনার কনভার্সন রেট (conversion rate) বেশি রাখতে কোট টেবিলগুলোকে ছোট রাখুন।

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