Задача
Клиент пришёл с жалобой на медленный каталог: страницы открывались более шести секунд, часть покупателей уходила, не дождавшись загрузки. Хостинг меняли дважды — не помогло, потому что дело было не в нём.
Что нашли
Сняли профиль запроса и увидели, что одна страница каталога делает 340 обращений к базе вместо десятка — классический N+1 в списке товаров. Индексов под фильтрацию и сортировку не было, поэтому каждый запрос читал таблицу целиком.
Пока нет замеров, оптимизировать бесполезно. Подробно разобрали это в статье Почему сайт на Laravel тормозит.
Что сделали
- Сняли профиль запроса в Clockwork и составили список самых долгих участков
- Убрали N+1 на списке товаров — жадная загрузка связей вместо запроса на каждый товар
- Добавили недостающие индексы в PostgreSQL под фильтрацию и сортировку каталога
- Настроили кеширование каталога и фильтров на Redis с инвалидацией при изменении товара
- Вынесли тяжёлые операции — пересчёт остатков и выгрузки — в очереди
Результат
Среднее время загрузки каталога снизилось с 6.2 до 2.0 секунд, число запросов к базе — с 340 до 12. Сервер стал держать пиковую нагрузку без просадок, магазин работал всё время работ: изменения шли в отдельной ветке с бэкапом перед каждым выпуском.
Проект остался у нас на абонентской поддержке — следим за скоростью и выкатываем правки по мере необходимости.