Как я могу упростить этот запрос Wordpress для повышения производительности? - PullRequest
1 голос
/ 21 декабря 2010

У меня есть несколько ящиков на сайте Wordpress, которые должны показывать подборку постов, которые принадлежат к определенным категориям И ТАКЖЕ не принадлежат нескольким другим.Используя только собственные инструменты WordPress, в результате получается запрос, подобный следующему:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.*
FROM wp_posts
INNER JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy
ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE 1=1
AND wp_term_taxonomy.taxonomy = 'category'
AND wp_term_taxonomy.term_id IN ('1', '49')
AND wp_posts.ID NOT IN ( 
    SELECT tr.object_id
    FROM wp_term_relationships AS tr
    INNER JOIN wp_term_taxonomy AS tt
    ON tr.term_taxonomy_id = tt.term_taxonomy_id
    WHERE tt.taxonomy = 'category'
    AND tt.term_id IN ('3394', '49', '794', '183') )
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, 5;

, теперь это довольно дорого и заканчивается в журнале медленных запросов.Поэтому я с удовольствием оставлю WordPress и создам запрос вручную.Во-первых, я могу устранить необходимость в таблице wp_term_taxonomy (я могу использовать term_taxonomy_id вместо term_id, я никогда не понимал, почему wordpress нуждается в обоих), но у меня все еще есть проблема NOT IT ( SUBQUERY ) из-за исключаемых категорий.

Итак, учитывая, что я могу делать что угодно (например, создавать другие «служебные» таблицы, если они могут помочь), как лучше всего ускорить этот поиск в этих условиях?

1 Ответ

0 голосов
/ 21 декабря 2010

Я не вижу необходимости в подзапросе, поскольку таблицы, которые он использует, уже находятся в вашем основном запросе! Таким образом, исключение вещей должно быть простым делом добавления большего количества к операторам WHERE.

Не можете ли вы отредактировать свою строку

AND wp_term_taxonomy.term_id IN ('1', '49')

до

AND wp_term_taxonomy.term_id IN ('1', '49') AND wp_term_taxonomy.term_id NOT IN ('3394', '49', '794', '183')

.. а затем полностью удалить подзапрос?

...