Интернет-магазин начал тормозить после роста каталога – что проверять

Интернет-магазин · проблемы и решения

Каталог вырос – и магазин начал заметно тормозить

Более мощный сервер может помочь, но сначала нужно понять, что именно перестало масштабироваться: база, фильтры, поиск, кеш, импорт, изображения или JavaScript.


Найти узкое место →


БОЛЬШЕ ТОВАРОВ ≠ ОБЯЗАТЕЛЬНО МЕДЛЕННЕЕ

Рост каталога часто не создаёт проблему – он просто проявляет уже существующее слабое место

Пока в магазине 500 товаров, неэффективный запрос, плохо построенный фильтр или постоянный пересчёт характеристик могут оставаться незаметными. При 20 000–50 000 товаров та же архитектура начинает стоить уже секунды.

БЫЛО
500 товаров · категория открывается быстро
СТАЛО
20 000 товаров · те же операции занимают секунды


ЧТО ИЗМЕНИЛОСЬ

Важно понять не сколько стало товаров, а сколько работы выполняется для каждого посетителя

Посетителю по-прежнему нужно показать первые 24 товара, цену, наличие, фильтры и изображения. Но сервер может каждый раз перерабатывать значительно больше данных, чем реально требуется для вывода этой страницы.

НОРМАЛЬНАЯ ЛОГИКА

Найти нужные 24 товара и необходимые данные
ДОРОГАЯ ЛОГИКА

Пересчитать весь каталог, характеристики, остатки и фильтры перед каждым показом


ПЕРВОЕ РАЗДЕЛЕНИЕ

Сначала выясните – пользователь ждёт сервер или браузер

Один и тот же симптом «страница медленная» может возникать до получения HTML или уже после ответа сервера.
СЕРВЕРНАЯ ЧАСТЬ
Долго ждём первый HTML

База данных, PHP/приложение, кеш, API, сервер.
БРАУЗЕРНАЯ ЧАСТЬ
HTML уже пришёл, но сайт ещё «думает»

JavaScript, изображения, DOM, виджеты, сторонние скрипты.


TTFB

Если долго не приходит первый ответ, сначала смотрите серверную цепочку

ЗАПРОС
Браузер → сервер
Приложение / CMS
База / кеш / API
TTFB
Начало получения HTML


НЕ ГОВОРИТЕ ПРОСТО «САЙТ МЕДЛЕННЫЙ»

Симптом уже подсказывает, где искать причину

ВСЕ СТРАНИЦЫ
Сервер, база, приложение, общий кеш
ТОЛЬКО КАТЕГОРИИ
Выборка товаров, фильтры, сортировка
ТОЛЬКО ПОИСК
Поисковый механизм и индекс
ТОЛЬКО ПРИ ИМПОРТЕ
Фоновые задачи, CPU, база, блокировки
HTML БЫСТРЫЙ, ИНТЕРФЕЙС ЗАВИСАЕТ
JavaScript, DOM, сторонние скрипты


КАТЕГОРИИ – ЧАСТО ПЕРВОЕ УЗКОЕ МЕСТО

Простая на вид страница каталога может выполнять десятки операций

Каждая категория может одновременно выбирать товары, рассчитывать фильтры, сортировать, проверять цены, остатки и характеристики.
Какие товары относятся к категории
Какие из них активны
Какие есть в наличии
Какая цена и скидка актуальны
Какие характеристики доступны
Сколько товаров соответствует каждому фильтру
Как отсортировать и какую страницу показать


ФИЛЬТРЫ – НЕ ТОЛЬКО SEO

Красивый фасетный интерфейс может заставлять сервер пересчитывать огромный объём данных

Пользователь выбирает Samsung
Система пересчитывает доступные значения
НОВЫЕ ЧИСЛА

Чёрные – 412 · Белые – 203 · 128 GB – 376 · В наличии – 503
Пользователь выбирает ещё 256 GB – пересчёт повторяется

Чем больше характеристик, тем важнее способ их хранения и выборки

Бренд, цвет, размер, материал, мощность, объём, совместимость, серия и десятки других свойств сами по себе нормальны. Проблема появляется, если каждая комбинация требует большого количества тяжёлых операций.

Бренд
Цвет
Размер
Материал
Мощность
Объём
Совместимость


МНОГО МЕЛКИХ ЗАПРОСОВ

Страница может быть медленной не из-за одного тяжёлого запроса, а из-за сотен повторяющихся

24 ТОВАРА

Цена + остаток + скидка + бренд + рейтинг + изображение
24 × 6 = 144 запроса
Плюс сама категория, меню, фильтры, рекомендации, корзина и другие данные.


ПОИСК – ОТДЕЛЬНАЯ СИСТЕМА

Если медленный только поиск, не нужно оптимизировать весь магазин

При десятках тысяч товаров поиск может учитывать название, артикул, бренд, характеристики, синонимы и опечатки. Это уже существенно сложнее обычного фильтра по одной колонке.

ПОЛЬЗОВАТЕЛЬ ВВОДИТ
«самсунг с24»

Поиск должен понять модель, бренд, опечатку и подходящие товары


ГЛУБОКАЯ ПАГИНАЦИЯ

Первая страница категории и страница №800 могут стоить серверу совершенно разных денег

СТРАНИЦА 1
0,5 с
СТРАНИЦА 800
6 с

Такой результат указывает уже не на общую «медленную CMS», а на конкретный способ получения глубокой страницы каталога.


КЕШ – КЛЮЧЕВОЙ СЛОЙ

Не обязательно генерировать одну и ту же страницу заново для каждого посетителя

Кеш может находиться на нескольких уровнях – от браузера и CDN до готовой страницы и результатов дорогих запросов.
1. Первый посетитель → сервер генерирует страницу
2. Результат сохраняется
3. Следующим посетителям отдаётся готовый результат


КЕШ МОЖЕТ БЫТЬ – И НЕ РАБОТАТЬ

Если каждое изменение остатка уничтожает кеш всей категории, он почти бесполезен

12:00 · категория закеширована
12:02 · изменился остаток → кеш сброшен
12:04 · изменилась цена → кеш сброшен снова

Кеш страницы и кеш данных – разные инструменты

БРАУЗЕР
Статические ресурсы
CDN
Доставка и кеш статических данных
ПОЛНОСТРАНИЧНЫЙ КЕШ
Готовый HTML
ОБЪЕКТНЫЙ КЕШ
Результаты дорогих вычислений и запросов


ФОНОВЫЕ ПРОЦЕССЫ

Импорт остатков и цен может тормозить покупателей, хотя они вообще не связаны с импортом

XML / CSV / API → тысячи обновлений
База выполняет массовые записи
Сбрасывается кеш / запускаются пересчёты
Посетитель конкурирует за те же CPU, диск и базу


ПРОВЕРЬТЕ РАСПИСАНИЕ

Несколько нормальных фоновых задач могут вместе создать серьёзную нагрузку

02:00
Резервная копия
02:00
Экспорт товаров
02:05
Обновление остатков
02:10
Генерация товарного фида


ВНЕШНИЕ ЗАВИСИМОСТИ

Карточка магазина не должна становиться такой же медленной, как чужой API

ВНЕШНИЕ СЕРВИСЫ

Доставка
CRM
Поставщик
Отзывы
Платёжный сервис
API отвечает 4 секунды → страница ждёт 4 секунды

Для части данных безопаснее использовать локальное хранение, кеш или фоновое обновление, а не ждать удалённую систему при каждом открытии страницы.


ИЗОБРАЖЕНИЯ

Быстрый backend не спасёт страницу, которая загружает десятки мегабайт фотографий

ПЛОХО

Изображение 4000×3000 px


Используется в карточке шириной 250 px.
ЛУЧШЕ

Размер изображения соответствует реальному отображению

Lazy loading полезен ниже первого экрана, но не должен задерживать главный контент

ПЕРВЫЙ ЭКРАН
Главное изображение нужно загрузить своевременно
НИЖЕ ЭКРАНА
Десятки товарных изображений можно загружать по мере необходимости


JAVASCRIPT

Сервер может ответить за 300 мс, а пользователь всё равно будет ждать

СЕРВЕР
HTML получен за 300 мс
БРАУЗЕР
Выполняет JavaScript ещё несколько секунд

Меню, фильтры, корзина, чат, аналитика, рекомендации, варианты товара и сторонние виджеты конкурируют за основной поток браузера.


СТОРОННИЕ СКРИПТЫ

Они накапливаются по одному – а тормозят страницу уже все вместе

Аналитика
Рекламный пиксель
Чат
Обратный звонок
Отзывы
Персонализация


Вопрос для каждого скрипта


Должен ли он действительно загружаться до того, как пользователь сможет работать с магазином?


АДМИНКА – ОТДЕЛЬНЫЙ СЦЕНАРИЙ

Покупатели могут ничего не замечать, а сотрудникам приходится ждать список товаров по 15 секунд

Административная таблица может одновременно выводить изображения, остатки, варианты, категории, бренды, поставщиков и множество дополнительных полей. При большом каталоге это отдельная задача оптимизации.


ЖЕЛЕЗО ТОЖЕ ВАЖНО

Но покупать ресурсы нужно после понимания, во что именно упирается система

CPU
RAM
Диск
PHP workers
Соединения БД


CPU 20%, RAM 50%, а SQL выполняется 8 секунд?


Дополнительный процессор может не решить основную проблему.

«Купим VPS помощнее» – не полноценная стратегия масштабирования

10 000 товаров → сервер перегружен
Покупаем сервер ×2
30 000 товаров → проблема возвращается

Если стоимость одного запроса растёт вместе с каталогом, более дорогое оборудование лишь финансирует неэффективную архитектуру.


ТЕСТИРУЙТЕ ДВА СОСТОЯНИЯ

Быстрый запрос из кеша и медленный первый запрос могут быть одной и той же страницей

ХОЛОДНЫЙ ЗАПРОС
4,0 с
ИЗ КЕША
0,2 с


РЕАЛЬНЫЕ ПОЛЬЗОВАТЕЛИ

Быстро на мощном ПК владельца – ещё не значит быстро для покупателей

ВЛАДЕЛЕЦ
Мощный ПК · быстрый интернет
ЧАСТЬ ПОКУПАТЕЛЕЙ
Недорогой Android · мобильная сеть


CORE WEB VITALS

Скорость нужно оценивать не одной абстрактной цифрой

LCP
До 2,5 с
Скорость появления основного содержимого.
INP
До 200 мс
Отзывчивость интерфейса.
CLS
До 0,1
Визуальная стабильность.


СКОРОСТЬ И SEO

Не превращайте оптимизацию скорости в охоту за магическими 100 баллами

Скорость важна для SEO и пользовательского опыта, но идеальный технический показатель не заменяет полезность страницы, ассортимент, релевантность и другие факторы.


Главная бизнес-задача


Пользователь должен быстро открыть каталог, применить фильтр, выбрать товар, добавить его в корзину и оформить заказ.


НЕ ПРОВЕРЯЙТЕ ТОЛЬКО ГЛАВНУЮ

Главная может быть самой простой и самой быстрой страницей магазина

Главная
Категория
Фильтр
Карточка
Поиск
Корзина
Checkout


НАБОР ТЕСТОВ

Проверяйте реальные сценарии, а не «среднюю скорость сайта»

Главная
Маленькая категория
Самая большая категория
Категория с фильтром
Несколько фильтров одновременно
Глубокая пагинация
Карточка с вариантами
Поиск
Корзина и оформление
Сайт во время синхронизации


ИЗМЕРЯЙТЕ ДО И ПОСЛЕ

«Оптимизировали базу» – это не результат, если неизвестно, что изменилось

ДО
TTFB 2,8 с
ПОСЛЕ
TTFB 0,6 с


СНАЧАЛА ИСПРАВЛЯЕМ САМОЕ ДОРОГОЕ

Не имеет смысла экономить 50 KB CSS, если сервер генерирует страницу пять секунд

СЕРВЕР 5 СЕКУНД
Сначала backend / база / кеш
СЕРВЕР 150 МС, ИНТЕРФЕЙС 4 СЕКУНДЫ
Сначала JavaScript и клиентская часть


КАРТА УЗКИХ МЕСТ

Не ускоряйте всё сразу – найдите самый дорогой участок системы

Сервер, база, фильтры, поиск, изображения, JavaScript и импорт проверяются как отдельные подсистемы.


ПРАКТИЧЕСКАЯ МАТРИЦА

Симптом → направление проверки

Высокий TTFB
Backend, база, кеш, API.
Медленные категории
Каталог, фильтры, сортировка.
Медленный поиск
Поисковый индекс и алгоритм.
Медленная глубокая пагинация
Способ выборки данных.
Тормоза после изменения остатков
Сброс кеша.
Сайт медленный во время импорта
Фоновые процессы и база.
Сервер быстрый, интерфейс зависает
JavaScript.
Админка медленная, магазин быстрый
Административные запросы.


ЧЕК-ЛИСТ ВЛАДЕЛЬЦА

Что проверять, если магазин начал тормозить

01Какие именно страницы стали медленными?
02Сколько ждём сервер и сколько – браузер?
03Какой TTFB у разных шаблонов?
04Как отличается холодный запрос от кешированного?
05Насколько медленнее самая большая категория?
06Что происходит при включении фильтров?
07Как ведёт себя глубокая пагинация?
08Сколько запросов выполняется к базе?
09Есть ли повторяющиеся запросы для каждого товара?
10Как рассчитываются значения фильтров?
11Насколько быстр поиск?
12Как часто уничтожается кеш?
13Что происходит во время обновления цен и остатков?
14Когда запускаются cron, бэкапы, фиды и выгрузки?
15Какие внешние API участвуют в генерации страницы?
16Подходят ли размеры изображений?
17Сколько JavaScript и сторонних виджетов выполняется?
18Что происходит с CPU, RAM и диском во время проблемы?
19Как отличаются мобильные и десктопные реальные данные?
20Измеряется ли результат после каждой оптимизации?


ГЛАВНЫЙ ВЫВОД

Не начинайте с покупки сервера – начинайте с поиска самой дорогой операции

Найти медленный сценарий

Отделить сервер от браузера

Измерить

Найти самое дорогое узкое место

Исправить

Повторно измерить

Частые вопросы о скорости большого интернет-магазина

Почему магазин стал медленным после добавления большого количества товаров?

Само количество товаров не обязательно является причиной. С ростом каталога становятся заметнее тяжёлые запросы, фильтры, сортировка, поиск, пересчёты характеристик, синхронизация и проблемы кеширования.

Стоит ли сразу менять хостинг?

Не обязательно. Сначала нужно определить, действительно ли система упирается в CPU, память, диск или количество процессов. Тяжёлый запрос к базе более мощный сервер может лишь временно скрыть.

Что показывает TTFB?

Он показывает время до начала получения ответа от сервера и помогает отделить серверную задержку от последующей обработки страницы браузером.

Что проверять, если медленные только фильтры?

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

Может ли кеш решить проблему большого каталога?

Да, но только при правильной стратегии. Нужно понимать, что кешируется, как долго живёт результат и какие изменения вызывают его очистку.

Почему сайт медленный только во время обновления остатков?

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

Нужно ли проверять скорость только на главной?

Нет. Для магазина критичнее отдельно тестировать категории, карточки, фильтры, поиск, корзину, checkout и другие реальные сценарии.

Какие Core Web Vitals нужно контролировать?

LCP оценивает загрузку основного содержимого, INP – отзывчивость интерфейса, CLS – визуальную стабильность. Для хорошей пользовательской оценки ориентируются примерно на LCP до 2,5 с, INP до 200 мс и CLS до 0,1.

Что важнее – ускорить сервер или JavaScript?

Зависит от источника задержки. Если HTML приходит пять секунд, сначала нужен backend. Если сервер отвечает быстро, а интерфейс не реагирует, нужно анализировать JavaScript и основной поток браузера.


МАГАЗИН ЗАМЕДЛИЛСЯ ПОСЛЕ РОСТА?

Найдём реальное узкое место до покупки нового сервера

Проверим категории, фильтры, поиск, серверный ответ, запросы к базе, кеш, импорт, изображения и браузерную часть – и определим, где именно система перестаёт масштабироваться.


Разобрать производительность магазина →