Каталог — самая нагруженная часть коммерческого сайта. Главная страница отдается почти всем одинаковой, а страница каталога собирается заново под каждый набор фильтров, сортировок и номеров страниц. Именно поэтому она тормозит первой.
Почему картинки — не главное
Изображения влияют на то, как быстро страница дорисуется. Но пользователь чаще жалуется на другое: он нажал «показать» и несколько секунд смотрит на неподвижный экран. В этот момент картинки еще даже не начали грузиться — сервер собирает список товаров.
Сжимать изображения нужно, современные форматы и отложенная загрузка обязательны. Просто это работа с последней третью проблемы, а начинать надо с первой.
Где на самом деле уходит время
Запросы к базе на каждый товар
Самая частая причина. Список получает тридцать товаров одним запросом, а потом на каждый делает еще несколько: цену, остаток, свойства, картинку, скидку. Тридцать товаров превращаются в полторы сотни запросов. По отдельности каждый быстрый, вместе — секунды.
Лечится выборкой всех нужных данных заранее, одним запросом на список, а не на элемент.
Фильтры без индексов
Фильтр по свойству, для которого в базе нет индекса, заставляет перебирать всю таблицу товаров. Пока товаров тысяча — незаметно. На сорока тысячах разница между «мгновенно» и «десять секунд».
Отсутствие кеша выборок
Один и тот же популярный набор фильтров пересобирается заново для каждого посетителя. Результаты таких выборок хорошо кешируются: данные меняются при обмене с учетной системой, а не ежесекундно.
Тяжелые шаблоны
Карточка товара в списке тянет за собой все свойства, включая те, что в списке не показываются. На одной карточке незаметно, на тридцати — заметно.
Подгрузка всего дерева разделов
Меню каталога на каждой странице строит полную структуру разделов со счетчиками товаров в каждом. Счетчики почти всегда считаются в реальном времени, хотя меняются раз в сутки.
Порядок работы простой: сначала измерить, где уходит время, потом чинить. Оптимизация «по ощущениям» обычно улучшает то, что и так работало.
С чего начинать
- Замерить время ответа сервера отдельно от времени отрисовки. Это два разных числа, и лечатся они по-разному.
- Посмотреть количество запросов к базе на одной странице каталога. Если их больше двух-трех десятков — причина найдена.
- Проверить индексы по тем свойствам, которые реально используются в фильтрах.
- Включить кеширование выборок и сбрасывать его по событию обмена, а не по таймеру.
- И только теперь заняться изображениями и скриптами.
Чего делать не стоит
Не стоит начинать с переезда на более мощный сервер. Он маскирует проблему: полторы сотни лишних запросов останутся, просто выполнятся быстрее. Через год каталог вырастет, и вы вернетесь к тому же разговору, но уже с большим счетом за хостинг.
Не стоит гнаться за идеальными показателями в автоматических проверках. Они полезны как ориентир, но не отражают того, что чувствует человек, нажимающий «показать еще». Измеряйте на реальных страницах с реальным количеством товаров, а не на главной.