2012-05-23 2 views
1

Я пытаюсь оптимизировать следующий запрос в wordpress, так как для получения результата требуется почти полтора минуты. Отношения таблиц выражаются в следующей диаграмме:Оптимизация запроса mysql - многие внутренние соединения

enter image description here

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_relationships AS tt1 
     ON (wp_posts.ID = tt1.object_id) 
     INNER JOIN wp_term_relationships AS tt2 
     ON (wp_posts.ID = tt2.object_id) 
     INNER JOIN wp_term_relationships AS tt3 
     ON (wp_posts.ID = tt3.object_id) 
     INNER JOIN wp_term_relationships AS tt4 
     ON (wp_posts.ID = tt4.object_id) 
    WHERE 1 = 1 
     AND (
      wp_term_relationships.term_taxonomy_id IN (25) 
      OR tt1.term_taxonomy_id IN (26) 
      OR tt2.term_taxonomy_id IN (16) 
      OR tt3.term_taxonomy_id IN (17) 
      OR tt4.term_taxonomy_id IN (18) 
     ) 
     AND wp_posts.post_type IN ('product') 
     AND (wp_posts.post_status = 'publish') 
    GROUP BY wp_posts.ID 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15 
+0

У меня возникли трудности, чтобы понять, что вы пытаетесь достичь здесь. Может быть, вы могли бы предоставить нам четкое текстовое объяснение наиболее важных объектов и результат, который вы пытаетесь получить? – Lukx

ответ

1

Я не понимаю точку всех внутренних объединений в таблице wp_term_relationships, когда все, что вам кажется, вы ищете, ищет ряд значений. Разве следующие не будут выполняться одинаково и выполняться намного быстрее?

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
    FROM wp_posts 
     INNER JOIN wp_term_relationships 
     ON (wp_posts.ID = wp_term_relationships.object_id) 
    WHERE wp_term_relationships.term_taxonomy_id IN (25, 26, 16, 17, 18) 
     AND wp_posts.post_type = 'product' 
     AND wp_posts.post_status = 'publish' 
    GROUP BY wp_posts.ID 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15 
0

Попробуйте это. Я думаю, что это будет быстрее.

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
FROM wp_posts, 
    wp_term_relationships 
WHERE wp_posts.ID = wp_term_relationships.object_id 
AND wp_term_relationships.term_taxonomy_id IN (25,26,16,17,18) 
AND wp_posts.post_type = 'product' 
AND wp_posts.post_status = 'publish' 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC 
LIMIT 0 , 15 

Вам не нужно так много ВНУТРЕННИХ ОБЪЕДИНЕНИЙ.

0

Если идея мультипликатора присоединяется был для получения сообщения с соответствующим term_taxonomy_id из 25, а также 26, а также 17, ... (это означает все термины в отличие от любого из них) , вы можете повторно использовать ответ KayakJim только с одним JOIN и добавить предложение HAVING, сохраняя только строки, соответствующие всем пяти терминам.

Вот бы модифицированный запрос:

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
    FROM wp_posts 
     INNER JOIN wp_term_relationships 
     ON (wp_posts.ID = wp_term_relationships.object_id) 
    WHERE wp_term_relationships.term_taxonomy_id IN (25, 26, 16, 17, 18) 
     AND wp_posts.post_type = 'product' 
     AND wp_posts.post_status = 'publish' 
    GROUP BY wp_posts.ID 
    HAVING count(*)=5 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15 
Смежные вопросы