Задача

Клиент пришёл с жалобой на медленный каталог: страницы открывались более шести секунд, часть покупателей уходила, не дождавшись загрузки. Хостинг меняли дважды — не помогло, потому что дело было не в нём.

Что нашли

Сняли профиль запроса и увидели, что одна страница каталога делает 340 обращений к базе вместо десятка — классический N+1 в списке товаров. Индексов под фильтрацию и сортировку не было, поэтому каждый запрос читал таблицу целиком.

Пока нет замеров, оптимизировать бесполезно. Подробно разобрали это в статье Почему сайт на Laravel тормозит.

Что сделали

  1. Сняли профиль запроса в Clockwork и составили список самых долгих участков
  2. Убрали N+1 на списке товаров — жадная загрузка связей вместо запроса на каждый товар
  3. Добавили недостающие индексы в PostgreSQL под фильтрацию и сортировку каталога
  4. Настроили кеширование каталога и фильтров на Redis с инвалидацией при изменении товара
  5. Вынесли тяжёлые операции — пересчёт остатков и выгрузки — в очереди

Результат

Среднее время загрузки каталога снизилось с 6.2 до 2.0 секунд, число запросов к базе — с 340 до 12. Сервер стал держать пиковую нагрузку без просадок, магазин работал всё время работ: изменения шли в отдельной ветке с бэкапом перед каждым выпуском.

Проект остался у нас на абонентской поддержке — следим за скоростью и выкатываем правки по мере необходимости.