Замедление оформления заказа в Magento 2: таблица quote как убийца производительности

В вашем магазине Magento 2 скрывается невидимый убийца производительности. Он живет в вашей базе данных.

Таблицы quote и quote_item растут каждый раз, когда покупатель добавляет товар в корзину. Если покупка не совершается, запись остается. За месяцы работы в этих таблицах могут накопиться миллионы строк.

Однажды я видел магазин, где в таблице quote было 15 миллионов строк. Скорость оформления заказа упала с 1,2 до 8 секунд. Владелец не понимал, в чем причина. Фронтенд был кэширован, поэтому всё выглядело нормально до тех пор, пока процесс оформления заказа не начинал давать сбой.

Огромные таблицы quote вызывают следующие проблемы:

  • Медленная загрузка страницы корзины из-за тяжелых соединений (joins) в базе данных.
  • Медленные AJAX-запросы при оформлении заказа для расчета доставки и итоговой суммы.
  • Замедление создания заказов через админ-панель.
  • Увеличение времени резервного копирования и восстановления базы данных.
  • Высокая нагрузка на память PHP-FPM.

Как это исправить:

1. Оцените масштаб проблемы

Проверьте количество строк и размер таблиц. Обратите внимание на количество stale_inactive. Это брошенные корзины старше 30 дней. Они не несут никакой пользы, но замедляют ваши запросы.

2. Сначала архивируйте, затем удаляйте

Не удаляйте миллионы строк за один раз. Это заблокирует таблицы и приведет к сбою базы данных. Сначала создайте архивные таблицы и перенесите в них неактивные корзины старше 90 дней.

3. Используйте пакетное удаление

Удаляйте строки небольшими порциями по 10 000. Это предотвратит длительные блокировки таблиц. Всегда сначала удаляйте данные из дочерних таблиц, чтобы соблюсти связи внешних ключей (foreign keys). Порядок должен быть следующим:

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

4. Оптимизация и индексация

Выполните OPTIMIZE TABLE, чтобы освободить место на диске. Добавьте составные индексы, чтобы помочь базе данных быстрее находить активные корзины. Например, добавьте индекс на (is_active, updated_at).

5. Автоматизируйте очистку

Используйте команду Magento CLI: bin/magento sales:cleanQuotes. Настройте cron-задачу для её еженедельного запуска в периоды низкой нагрузки.

Совет профи: Больше всего раздувают базу корзины гостей. Уменьшите срок жизни гостевой корзины до 7 дней в настройках. Это позволит держать базу данных в чистоте, не мешая реальным покупателям.

Один клиент сократил время загрузки оформления заказа с 6,5 до 1,4 секунды, используя эти шаги. Также удалось освободить 9 ГБ места в базе данных.

Держите таблицы quote компактными, чтобы сохранять высокие показатели конверсии.

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