Клиент жалуется: «Магазин тормозит, фильтры виснут по 5–7 секунд, заказы обрабатываются медленно». Вы смотрите на сервер — ресурсов хватает. Кэш настроен. CDN подключён. А проблема никуда не делась. Знакомая ситуация?
В 90% случаев, когда WooCommerce-магазин «тупит» при нормальном хостинге, причина кроется не в PHP и не в плагинах — в неоптимизированной базе данных. Таблицы растут, запросы становятся тяжелее, а MySQL вынужден сканировать сотни тысяч строк, чтобы вернуть десяток. Исправляется это добавлением правильных индексов — ключей, которые указывают базе данных, где именно искать.
В этой статье разберём, какие индексы реально нужны WooCommerce-магазину, как их добавить и что это даёт на практике.
Почему WooCommerce работает медленно на больших объёмах
WooCommerce построен на WordPress, а WordPress — на так называемой EAV-архитектуре (Entity-Attribute-Value). Все данные о товарах хранятся не в одном удобном месте, а размазаны по таблице wp_postmeta. Название товара — в одном ряду. Цена — в другом. Артикул — в третьем. Для одного товара может быть 20–40 строк в postmeta.
Теперь представьте: у вас 5 000 товаров. Это уже 100 000–200 000 строк в postmeta. Добавьте сюда заказы, их мета-данные, транзакции — и вы получаете таблицу на несколько миллионов строк.
Когда WooCommerce строит фильтр по цене или формирует список заказов в админке, он делает JOIN между таблицами. Без индексов MySQL перебирает каждую строку вручную — это называется full table scan. На 100 строках незаметно. На миллионах — катастрофа.
Как проверить, какие запросы тормозят
Прежде чем хрустеть индексами, нужно понять, что именно болит. Есть несколько способов диагностики:
- Плагин Query Monitor — показывает все SQL-запросы на странице с временем выполнения. Страница с 50+ запросами, каждый по 0.5 секунды, — это уже красный флаг.
- MySQL Slow Query Log — включается на сервере, логирует все запросы дольше заданного порога (обычно 1–2 секунды).
- EXPLAIN — команда, которая показывает план выполнения запроса. Если в колонке type видите
ALL— значит, сканируется вся таблица. Значит, индекс нужен.
Пример использования EXPLAIN:
EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = '_price' AND meta_value > 1000;
Если результат показывает rows: 480000 и type: ALL — вот ваша проблема. После добавления индекса тот же запрос отработает в десятки раз быстрее.
Какие таблицы WooCommerce нужно индексировать
Разберём основные таблицы, которые страдают больше всего. Я приведу готовые SQL-запросы — можно выполнить через phpMyAdmin или WP-CLI.
wp_postmeta — мета-данные товаров и заказов
Это главная боль WooCommerce. По умолчанию в таблице есть только индекс на post_id и meta_key. Но часто нужны выборки по конкретным ключам — цена, наличие, артикул. Для этого добавляем составной индекс:
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key_value (meta_key(50), meta_value(50));
Конкретный размер префикса (50) подбирайте под свои данные. Если значения короткие — можно уменьшить.
Популярные запросы, которые ускоряются:
- Фильтр по цене (
_price) - Поиск по артикулу (
_sku) - Фильтр по наличию (
_stock_status) - Сортировка по дате создания (
_wc_average_rating)
wp_options — таблица настроек и транзиентов
WooCommerce хранит в wp_options кэшированные данные: транзиенты, настройки магазина, сессии. Каждый заголовок страницы инициирует запрос к этой таблице. Если транзиентов накопилось несколько тысяч — без индекса всё тормозит.
ALTER TABLE wp_options ADD INDEX idx_option_name (option_name(50));
Кстати, раз в несколько месяцев полезно чистить устаревшие транзиенты. У меня был случай: таблица wp_options весила 800 МБ, из которых 700 — мёртвые транзиенты. После очистки и добавления индекса админка ожила.
wp_wc_order_stats — статистика заказов
Эта таблица появилась в WooCommerce 3.x и используется для отчётов. Если у вас крупный магазин с тысячами заказов, отчёты в админке могут подтормаживать. Помогает индекс:
ALTER TABLE wp_wc_order_stats ADD INDEX idx_status_date (status, date_created); ALTER TABLE wp_wc_order_stats ADD INDEX idx_customer_id (customer_id);
wp_wc_order_product_lookup
Ещё одна таблица из системы отчётов WooCommerce. Хранит данные о товарах в заказах. Без индексов по order_id и product_id отчёт по продажам может виснуть надолго:
ALTER TABLE wp_wc_order_product_lookup ADD INDEX idx_order_id (order_id); ALTER TABLE wp_wc_order_product_lookup ADD INDEX idx_product_id (product_id);
wp_comments и wp_commentmeta
Отзывы к товарам хранятся в таблице комментариев. Если отзывов тысячи — фильтрация по товару и проверка статуса может быть медленной:
ALTER TABLE wp_comments ADD INDEX idx_comment_post_status (comment_post_ID, comment_approved, comment_type);
Полный список рекомендуемых индексов
Сводная таблица по ключевым индексам для WooCommerce:
| Таблица | Индекс | Для чего нужен |
|---|---|---|
| wp_postmeta | meta_key + meta_value | Фильтры товаров, поиск по атрибутам |
| wp_options | option_name | Ускорение загрузки настроек и транзиентов |
| wp_wc_order_stats | status + date_created | Отчёты по заказам в админке |
| wp_wc_order_stats | customer_id | История заказов клиента |
| wp_wc_order_product_lookup | order_id | Отчёт по товарам в заказах |
| wp_comments | comment_post_ID + status + type | Отзывы к товарам |
Как безопасно добавить индексы
Перед любыми манипуляциями с базой — бэкап. Это аксиома. Даже если вы уверены в запросе на 100%, сделайте дамп базы. Через WP-CLI это одна команда:
wp db export backup-before-indexes.sql
Дальше — несколько правил безопасности:
- Добавляйте индексы в период низкой нагрузки. Процесс может занять от нескольких секунд до нескольких минут на больших таблицах. Во время построения индекса таблица будет заблокирована.
- Не добавляйте индексы «на всякий случай». Каждый индекс ускоряет SELECT, но замедляет INSERT и UPDATE. Для таблицы с частыми записями это критично.
- Проверяйте, нет ли индекса уже. Повторный запрос просто упадёт с ошибкой.
- Используйте формат DYNAMIC для таблиц InnoDB — это стандарт, но проверить стоит.
Посмотреть существующие индексы можно так:
SHOW INDEX FROM wp_postmeta;
Автоматизация: плагины для оптимизации БД
Если писать SQL вручную не хочется, есть инструменты:
- Index WP MySQL For Speed — плагин от разработчиков, которые разбираются в архитектуре WordPress. Он автоматически добавляет нужные индексы к основным таблицам. Можно включить и забыть.
- WP-Optimize — чистит мусор и оптимизирует таблицы, но индексы добавляет не все.
- Advanced Database Cleaner — хорош для удаления ревизий, спама, остатков удалённых плагинов.
Мой совет: начните с Index WP MySQL For Speed — он закрывает 80% потребностей. Остальное —เฉพированно, под конкретные запросы вашего магазина.
Что ещё влияет на скорость БД WooCommerce
Индексы — мощный инструмент, но не панацея. Вот что ещё стоит сделать:
- Перейти на InnoDB — если какие-то таблицы всё ещё на MyISAM, конвертируйте. InnoDB лучше работает с транзакциями и блокировками на уровне строк.
- Оптимизировать PHP-код. Один «тяжёлый» плагин может генерировать 200 запросов на страницу. Никакие индексы это не спасут.
- Настроить object cache — Redis или Memcached кэшируют результаты запросов в оперативной памяти. Повторные обращения к БД исключаются.
- Чистить ревизии и черновики. WooCommerce создаёт много служебных постов. Ревизии накапливаются. Установите лимит:
define('WP_POST_REVISIONS', 5); - Использовать HPOS (High-Performance Order Storage) — новая система хранения заказов WooCommerce, которая переносит заказы из wp_posts/wp_postmeta в отдельные оптимизированные таблицы. Это кардинальное улучшение.
Про HPOS стоит сказать подробнее. Раньше каждый заказ WooCommerce — это пост типа shop_order. Теперь заказы хранятся в собственных таблицах wp_wc_orders и wp_wc_orders_meta. Это снимает нагрузку с wp_postmeta и ускоряет админку на порядок. Включение HPOS — отдельная тема, но если вы на свежей версии WooCommerce — однозначно стоит рассмотреть.
Реальные результаты: что даёт индексация
Приведу пример из практики. Магазин электроники: 12 000 товаров, 45 000 заказов. Каталог загружался за 4–6 секунд. Админка «Все заказы» — за 8–12 секунд. После добавления индексов:
- Каталог с фильтрами: с 4.8 сек → 0.9 сек
- Страница «Заказы» в админке: с 11 сек → 1.5 сек
- Запрос на поиск товара по артикулу: с 2.3 сек → 0.05 сек
Никаких изменений в хостинге, плагинах или теме. Только индексы.
Когда лучше не трогать
Бывают ситуации, когда самостоятельная индексация — не лучшая идея:
- Вы не уверены, что делаете. Один неправильный запрос — и таблица может «лечь».
- Магазин на shared-хостинге с ограничениями. Некоторые хостеры блокируют ALTER TABLE.
- База уже оптимизирована плагином или хостером. Проверьте перед тем, как добавлять дубли.
- Проблема не в БД, а в коде. 300 запросов на страницу не спасёт ни один индекс.
В этих случаях лучше привлечь специалиста, который проведёт аудит запросов, проанализирует slow log и предложит точечное решение.
Итого: чек-лист оптимизации БД WooCommerce
- Проанализируйте скорость запросов через Query Monitor или slow query log
- Сделайте резервную копию базы данных
- Добавьте индексы на wp_postmeta (meta_key + meta_value)
- Добавьте индекс на wp_options (option_name)
- Проиндексируйте таблицы отчётов WooCommerce
- Включите HPOS для хранения заказов
- Настройте object cache (Redis/Memcached)
- Проверьте результат — замерьте время выполнения ключевых страниц
Оптимизация базы WooCommerce — это не «раз и забыл». Со временем таблицы растут, плагины добавляют новые данные, мета-ключи меняются. Раз в квартал полезно заглянуть в Query Monitor и убедиться, что ничего не раздулось.</
Добавить комментарий