Уповільнення оформлення замовлення в Magento 2: вбивця через таблицю quote
У вашому магазині Magento 2 є прихований вбивця продуктивності. Він живе у вашій базі даних.
Таблиці quote та quote_item зростають щоразу, коли клієнт додає товар у кошик. Якщо покупка не відбувається, запис залишається. Протягом місяців ці таблиці розростаються до мільйонів рядків.
Я одного разу бачив магазин із 15 мільйонами рядків у таблиці quote. Швидкість оформлення замовлення впала з 1,2 секунди до 8 секунд. Власник не розумів чому. Фронтенд був кешованим, тому все виглядало добре, поки оформлення замовлення не починало давати збій.
Великі таблиці quote спричиняють такі проблеми:
- Повільне завантаження сторінки кошика через важкі об'єднання (joins) у базі даних.
- Повільні AJAX-запити під час оформлення замовлення для розрахунку доставки та підсумкової вартості.
- Уповільнення створення замовлень в адмін-панелі.
- Збільшення часу резервного копіювання та відновлення бази даних.
- Високе навантаження на пам'ять PHP-FPM.
Як це виправити:
Оцініть масштаб проблеми Перевірте кількість рядків і розмір таблиць. Зверніть увагу на кількість stale_inactive. Це покинуті кошики старше 30 днів. Вони не несуть жодної користі, а лише уповільнюють ваші запити.
Архівуйте перед видаленням Не видаляйте мільйони рядків одним махом. Це заблокує ваші таблиці та призведе до збою бази даних. Спочатку створіть архівні таблиці та перенесіть у них неактивні quote, які старші за 90 днів.
Використовуйте пакетне видалення Видаляйте рядки невеликими порціями по 10 000. Це запобігає тривалому блокуванню таблиць. Завжди спочатку видаляйте дочірні таблиці, щоб дотримуватися зв'язків зовнішніх ключів. Порядок має бути таким:
- quote_item_option
- quote_address_item
- quote_shipping_rate
- quote_payment
- quote_address
- quote_item
- quote
Оптимізуйте та індексуйте Виконайте OPTIMIZE TABLE, щоб звільнити місце на диску. Додайте складені індекси (composite indexes), щоб допомогти базі даних швидше знаходити активні quote. Наприклад, додайте індекс на (is_active, updated_at).
Автоматизуйте очищення Використовуйте команду Magento CLI:
bin/magento sales:cleanQuotes. Налаштуйте cron-завдання для її щотижневого виконання у періоди низького трафіку.
Порада експерта: Кошики гостей створюють найбільше роздування даних. Зменште термін дії гостьового кошика (guest quote lifetime) до 7 днів у вашій конфігурації. Це дозволить тримати вашу базу даних у порядку, не зачіпаючи реальних клієнтів.
Один клієнт завдяки цим крокам скоротив час завантаження оформлення замовлення з 6,5 с до 1,4 с. Також вдалося звільнити 9 ГБ місця в базі даних.
Тримайте таблиці quote невеликими, щоб підтримувати високий рівень конверсії.
