Як оптимізувати reindex в Magento 2?

Оскільки архітектура Magento структурована таким чином, щоб зберігати дані в різних таблицях бази даних, усі дані потрібно переіндексувати, після того як ви вносите будь-які зміни у свій магазин. І хоча ви можете зробити reindex Magento 2 через CLI або навіть адмін панель, цей процес всерівно займає багато часу.

У цій статті ми хочемо допомогти вам оптимізувати цей процес.

Оскільки індексер Catalog Category Product виконується найдовше, ми візьмемо його як приклад для цієї статті. Отже, ви можете оптимізувати час виконання реіндексу в Magento, змінивши batch_size індексера Catalog Category Product.

Однак, щоб отримати краще уявлення про те, як це працює, давайте визначимо, що таке batch size та чому його потрібно змінювати.

Як працює Magento reindex?

Batch size — це кількість індексів, які будуть оброблені одночасно, за один MySQL запит.

Уявіть, що у вас є магазин із 40 000 продуктів, і ви вносите якісь зміни, як-от масове оновлення цін всіх своїх продуктів. Це призведе до того, що 40 тис. індексів стануть недійсними.

Magento розділяє дані для реіндексу наступним чином:

Number of batches = number of indexes / batch size
Кількість груп = кількість індексів / розмір групи

Однак групування (batching) доступне не для всіх індексерів. Перевірте доступні індексери та їхній розмір за замовчуванням у цій таблиці:

Назва індексера Значення за замовчуванням
catalog_product_price 5000
cataloginventory_stock 200
catalog_category_product 100000
catalog_product_attribute 1000


Давайте розглянемо наступний приклад і обчислимо розмір групи для індексера catalog_product_price.

  • Розмір групи за замовчуванням для catalog_product_price - 5000
  • Кількість продуктів - 40000

В результаті:

Кількість груп = 40000/5000 = 8 груп

Якщо ви запустите реіндекс, Magento обробить першу із 8 груп, потім другу і так далі. Таким чином, групи оброблятимуться по черзі, а деякі інші запити, як-от збереження продукту, можуть бути виконані.

Тепер обчислимо розмір групи для індексера catalog_category_price:

  • Розмір групи за замовчуванням для catalog_category_price - 100000
  • Кількість продуктів - 40000

В результаті:

Кількість груп = 40000/100000 = 0.4 = 1 група

Отже, маємо одну групу. Це означає, що всі 40 тис. індексів будуть опрацьовані одночасно, що перевантажить вашу базу даних і призведе до проблем з deadlocks.

Як оптимізувати Magento 2 reindex?

Беручи до уваги приклади, які ми щойно розглянули, краще зменшити параметр batch_size для catalog_category_product і використовувати значення до 5000.

Для цього додайте такі рядки до файлу app/etc/env.php:

'indexer' => [
        'batch_size' => [
            'catalog_category_product' => 1000         ]  ],

Щоб оптимізувати інші індексери, ви можете слідувати документації Magento.