Wordpress

Оптимизация базы данных WordPress: как ускорить сайт без покупки дорогого хостинга

21.05.2026 6 мин чтения
Спидометр, показывающий максимальную скорость загрузки сайта

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

Я видел десятки проектов на WordPress, где владельцы тратили по пятнадцать-двадцать тысяч рублей в месяц на «выделенный сервер космической мощности» для небольшого каталога на тысячу товаров, но сайт всё равно умудрялся задумываться перед каждым кликом. Причина банальна: наращивание «железа» не решает проблему неоптимального кода, кривых SQL-запросов и забитого мусором кэша. Настоящая оптимизация скорости — это не покупка гигабайтов оперативной памяти, а методичное наведение порядка в архитектуре самого приложения.

Анатомия тормозов: куда уходит время ответа сервера (TTFB)

Когда вы замеряете скорость в Google PageSpeed Insights, сервис обычно пинает вас за неоптимизированные картинки и тяжелые скрипты. Но на самом деле самое критичное и сложное для исправления узкое место — это TTFB (Time to First Byte), время получения первого байта от сервера. Если ваш сервер думает 1.5 секунды, прежде чем начать отдавать страницу, то никакая сжатая графика её не спасёт.

В моей практике на одном из проектов — интернет-магазине на WordPress 6.x с WooCommerce, 500 товаров, страница форм загружалась 4.2s. Карточка товара собиралась базой данных ровно 3.2 секунды. При этом профессор сервера был загружен на 90%. Мы провели профилирование с помощью плагина Query Monitor и обнаружили, что при каждом просмотре товара плагин вывода «Похожих товаров» генерировал 42 отдельных SQL-запросов, перебирая всю базу из 12 000 позиций без всякого индексирования и кэширования. Перенос этой выборки во временный транзитный кэш снизил TTFB до комфортных 220 миллисекунд без копейки вложений в апгрейд сервера.

Основными причинами высокого TTFB в WordPress обычно служат три фактора:

  • Избыточные и неоптимальные SQL-запросы. Этим грешат тяжелые конструкторы страниц, модули динамического пересчёта цен и плагины фильтрации товаров.
  • Отсутствие объектного кэширования базы данных. По умолчанию WordPress делает запросы к БД при каждой загрузке страницы, даже если данные не менялись месяцами. Также полезно настроить надежное резервное копирование пред любыми крупными изменениями в БД, чтобы не потерять данные.
  • Автозагрузка опций плагинов. Таблица wp_options со временем разрастается до сотен мегабайт, и WordPress при каждом хите читает её целиком, тратя на это драгоценные доли секунды.

Практический чеклист по укрощению wp_options

Каждый раз, когда вы устанавливаете и удаляете очередное расширение, его настройки навсегда остаются в базе. Более того, разработчики плагинов обожают ставить флаг автозагрузки (autoload = "yes") на все свои опции. В итоге массив данных, который загружается в память PHP ещё до инициализации темы, раздувается до неприличных размеров.

Тобы понять, страдает ли ваш проект этой болезнью, откройте phpMyAdmin или воспользуйтесь консольной утилитой WP-CLI и выполните простой SQL-запрос:

SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload = "yes";

Если полученная цифра превышает 1 000 000 байт (около 1 МБ) — у вас проблемы. На одном клиентском сайте этот размер составлял аж 84 МБ! WordPress тратил почти секунду только на то, чтобы прочитать и распарсить эту гору текстового мусора. Тобы наведение порядка, найдите самые весомые опции через следующий запрос:

SELECT option_name, length(option_value) AS option_len FROM wp_options WHERE autoload = "yes" ORDER BY option_len DESC LIMIT 20;

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

UPDATE wp_options SET autoload = "no" WHERE option_name = "problematic_option_name";
Безопасность и оптимизация сайта под защитой

Объектное кэширование: Redis как спаситель базы данных

Многие путают кэширование страниц (page cache) с объектным кэшированием (object cache). Кэширование страниц (с помощью плагинов типа WP Super Cache или настроек Nginx) сохраняет генерированную страницу целиком в виде статического HTML-файла. Это отлично работает для неавторизованных гостей и простых блогов. Однако, если вспомнить наш подробный регламент безопасного обновления плагинов WordPress — любой сброс кэша или изменение динамического контента мгновенно заставляет базу работать на пределе.

Но как только на сайт заходит авторизованный пользователь, или в корзину добавляется товар — статический кэш отключается. Серверу приходится генерировать страницу заново. Здесь на сцену выходит объектное кэширование в оперативной памяти с помощью Redis или Memcached.

Redis сохраняет в ОЗУ результаты сложных SQL-выборок, метаданные постов и временные опции (transients). При повторном запросе WordPress забирает данные напрямую из сверхбыстрой памяти за доли миллисекунд, минуя тяжелые SQL-запросы к MySQL. Для включения Redis на вашем сервере достаточно выполнить несколько простых шагов:

  1. Убедитесь, что расширение PHP Redis установлено и активно на вашем хостинге.
  2. Установите плагин Redis Object Cache через панель управления WordPress.
  3. Добавьте в файл wp-config.php следующие строки для обеспечения изоляции кэша (особенно важно, если на сервере крутится несколько сайтов):
    define("WP_CACHE_KEY_SALT", "slesarweb_prod_");
    define("WP_REDIS_DATABASE", 1);

  4. Включите кэширование в интерфейсе плагина.

По моему опыту, связка Redis Object Cache с базой данных MySQL способна снизить нагрузку на процессор сервера в 3–5 раз и ускорить работу личного кабинета и корзину WooCommerce практихески до мгновенного отклика.

Почему плагины всё-в-одном часто делают только хуже

На рынке полно «волшебных таблеток» вроде WP Rocket, Litespeed Cache (если вы не на сервере LiteSpeed) или аналогичных монстров, которые обещают оптимизировать всё в один клик. К сожалению, они часто создают иллюзию скорости, подменяя реальное решение проблем поверхностным замазыванием.

Например, авто-минификация и объединение JS/CSS скриптов могут напрочь сломать интерактивные элементы интерфейса (формы заявок, слайдеры, калькуляторы), из-за чего конверсии упадут в разы, пока вы будете радоваться зелёной зоне в PageSpeed. К тому же, если у вас настроен современный протокол HTTP/2 или HTTP/3, объединение файлов в один гигантский бандл скорее вредит производительности, лишая браузер возможности загружать ресурсы параллельно и кэшировать их по отдельности.

Вместо бездумного включения всех галочек в оптимизаторах, разделите задачи. Доверьте серверное кэширование nginx или Redis, оптимизацию изображений сделайте один раз через ffmpeg конвертеры пред загрузкой, а скрипты подключайте аккуратно, используя атрибуты defer и async только там, где они действительно уместны.

А как вы решаете проблемы со скоростью на своих проектах? Часто ли приходится прибегать к тонкой настройке базы данных, или обходитесь стандартными плагинами оптимизации? Давайте обсудим ваши подходы.

Евгений Слесаренко
Автор

Евгений Слесаренко

Частный разработчик на Bitrix и WordPress. Пишу о том, как делать сайты и сервисы понятнее, сильнее визуально и спокойнее в поддержке.