Исправить медленный запрос wp_term_relationships в get_posts

Вопрос или проблема

Я использовал плагин Query Monitor, чтобы найти медленный запрос на своем сайте WordPress. Упомянутый ниже WP_Query->get_posts() занимает около 0.3446 времени запроса из общего времени запроса базы данных 0.3976.

SELECT wp_posts.ID
FROM wp_posts 
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1 
AND wp_posts.ID NOT IN (203598)
AND ( wp_term_relationships.term_taxonomy_id IN (17) 
OR wp_term_relationships.term_taxonomy_id IN (11652,20693,21952,23971,24907,24908,25928) )
AND wp_posts.post_type="post"
AND ((wp_posts.post_status="publish"))
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 6

Я предполагаю, что это как-то связано с более чем 20,000 тегами, использованными в записях на моем сайте. Так ли это? Если да, то как вы предлагаете исправить этот медленный запрос? Или как я должен удалить теги, которые не используются более чем в 5 записях на сайте?

Пожалуйста, помогите.

Я столкнулся с той же проблемой, но с атрибутами продуктов, поскольку у меня было более 20000 продуктов и намного больше атрибутов продуктов, запросы были очень медленными.

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

Чтобы избежать max_execution_time, попытайтесь настроить ваш плагин на выполнение инструкций по преобразованию тегов небольшими частями. Например, от записей 1 до 2000 и от 2000 до 4000 и так далее.

Индексация базы данных также может помочь.

Наконец, попробуйте использовать кэш-плагин, такой как wp_fastest_cache, он очень полезен.

Ответ или решение

Ваша проблема со медленным запросом в WordPress, связанная с таблицей wp_term_relationships, действительно может быть связана с большим количеством тегов. Расположение более 20,000 меток (тегов) может значительно усложнить выполнение ваших запросов. Давайте обсудим, как можно оптимизировать данный запрос, а также рассмотрим варианты удаления неиспользуемых тегов.

Оптимизация медленного запроса

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

  1. Отсутствие индексов: Запросы к большим таблицам без надлежащих индексов могут замедлить работу базы данных. Ваша таблица wp_term_relationships может не иметь индексов для полей, используемых в условиях JOIN или WHERE. Это можно исправить, добавив индексы:

    CREATE INDEX idx_object_id ON wp_term_relationships(object_id);
    CREATE INDEX idx_term_taxonomy_id ON wp_term_relationships(term_taxonomy_id);
  2. Сложные условия: Запрос также имеет множественные условия IN, что может усложнять обработку. Рассмотрите возможность их упрощения или ограничения числа передаваемых параметров.

  3. Устранение избыточности: Если вам не нужно использовать GROUP BY, попробуйте удалить его. Также проверьте на необходимость LIMIT. Ваша выборка может быть более производительной без лишних операций.

Улучшение обработки меток

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

SELECT t.term_id, t.name, COUNT(tr.object_id) as count
FROM wp_terms t
LEFT JOIN wp_term_relationships tr ON t.term_id = tr.term_taxonomy_id
GROUP BY t.term_id
HAVING count < 5;

После этого вы можете удалить такие метки с помощью команды DELETE:

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM (SELECT t.term_id FROM wp_terms t LEFT JOIN wp_term_relationships tr ON t.term_id = tr.term_taxonomy_id GROUP BY t.term_id HAVING count < 5) AS tmp);

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

Использование кэша для оптимизации производительности

Установка и использование кэша также может существенно ускорить работу вашего сайта. Рассмотрите использование плагинов, таких как WP Fastest Cache или W3 Total Cache, которые позволяют кэшировать страницы, объекты и базы данных.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...