Как я ускорил медленный сайт в 10 раз: кэш, индексы и ленивая загрузка

ElenaHappy

New member
Года полтора назад я взял на сопровождение интернет-магазин, который открывался в среднем за 8,4 секунды. Владелец жаловался, что реклама сливает бюджет, а я сначала не поверил: ну не может нормальный сайт так тормозить. Открыл, замерил — и правда, пока страница оживала, я успевал сходить за кофе. Через три недели работы тот же сайт отдавал первую отрисовку меньше чем за секунду, а полная загрузка уложилась в 0,8 секунды. Это не магия и не переписывание проекта с нуля, а три вещи, о которых я и хочу рассказать.

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

Первым делом я занялся кэшированием, и это дало самый заметный прирост. Поставил Redis для тяжёлых выборок и фрагментов шаблонов, включил opcache для PHP, настроил кэш страниц для гостей и добавил нормальные заголовки кэширования для статики. Отдельно скажу про инвалидацию: если кэш чистить неправильно, пользователи увидят старые цены и остатки, а это уже потерянные деньги и злые клиенты. Поэтому я повесил сброс кэша на события изменения товара, а не на таймер вслепую. Правило простое: кэшируйте то, что читается часто и меняется редко, и всегда думайте, что именно должно этот кэш сбросить.

Второй шаг — индексы в базе. Я вытащил из медленного лога самые тяжёлые запросы и прогнал их с планом выполнения. Выяснилось, что фильтр по категории, цене и наличию шёл полным перебором таблицы на несколько сотен тысяч строк, а на каждой карточке товара дёргались ещё и связанные сущности отдельными запросами. Я добавил составные индексы под конкретные условия фильтрации и сортировки, убрал лишние и переписал выборку так, чтобы связи подтягивались одним-двумя запросами, а не сотней мелких. Время ответа базы упало с секунд до десятков миллисекунд. Запомните: индекс — это не роскошь, а способ не заставлять сервер читать всю таблицу ради одной строки.

Третьим пунктом была ленивая загрузка. Я перевёл изображения в современный формат, отдал им фиксированные размеры, чтобы вёрстка не прыгала, и повесил отложенную загрузку на всё, что находится ниже первого экрана. Скрипты разбил на части и подключил с отложенным выполнением, а тяжёлые виджеты вроде карты и онлайн-чата стали грузиться только при взаимодействии. Карта, которая раньше тянула мегабайт скриптов при каждом открытии страницы, теперь почти не влияет на первую отрисовку. Тут главное не перестараться: ленивая загрузка для главного баннера или первого экрана делает только хуже, потому что пользователь видит пустоту дольше, чем мог бы.

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

Если у вас сайт тоже ползёт, не бросайтесь сразу переписывать всё на новом фреймворке. Сначала измерьте, где именно теряется время, потом включите кэш с осмысленной инвалидацией, потом проверьте индексы и запросы, и только после этого трогайте фронтенд с ленивой загрузкой. Делайте по одному изменению за раз и записывайте цифры до и после — иначе не поймёте, что реально сработало. И обязательно проверяйте результат на реальных пользователях, а не только в лаборатории: у людей медленные телефоны и слабый интернет, и ваши красивые замеры на быстром ноутбуке им ничем не помогут.

А теперь вопрос к вам, коллеги: какая оптимизация дала лично вам самый неожиданный прирост — кэш, индексы, ленивая загрузка или что-то совсем другое? Делитесь историями, интересно сравнить опыт.
 
Назад
Вверх