2011-01-02 15 views
0

Ich versuche, die optimale Kombination von Indizes für die Abfrage unten herauszufinden. Im Moment ist es vorübergehend; Verwenden von filesort und das Beenden meiner vps. Abfragen dauern zwischen 6 und 10 Sekunden.Wie würde ich diese Wordpress-Abfrage optimieren?

SELECT SQL_CALC_FOUND_ROWS 
    wp_posts.ID  
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) 
    INNER JOIN wp_terms ON (wp_term_taxonomy.term_id = wp_terms.term_id) 
WHERE 
    1=1 
    AND wp_term_taxonomy.taxonomy = 'post_tag' 
    AND wp_terms.slug IN ('pie') 
    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, 20 

Irgendwelche Vorschläge?

+0

sich Gedanken über Ihren Ausführungsplan machen? – ajreal

Antwort

1

Wie vergleicht sich dies in Bezug auf die Leistung?

SELECT 
    p.ID 
FROM 
    wp_posts AS p 
WHERE 
    1=1 
    AND p.post_type = 'post' 
    AND p.post_status = 'publish' 
    AND EXISTS (
    SELECT 1 
     FROM wp_term_relationships AS r 
      INNER JOIN wp_term_taxonomy AS t ON 
      r.term_taxonomy_id = t.term_taxonomy_id AND t.taxonomy = 'post_tag' 
      INNER JOIN wp_terms AS m ON 
      m.term_id = t.term_id AND m.slug IN ('pie') 
    WHERE r.object_id = wp_posts.ID 
) 
ORDER BY 
    p.post_date DESC 
LIMIT 0, 20 

Indizes sollten die Primär- und Fremdschlüssel auf alle, auf wp_terms.slug, auf wp_term_taxonomy.taxonomy und einen Verbundüber wp_posts.post_status, post_type, post_date.

+0

Ich habe einen zusammengesetzten Index hinzugefügt, aber die Abfrage hat ihn nicht verwendet. Es blieb mit dem Index auf dem Primärschlüssel. Leider kann ich die Struktur der Anfrage aufgrund der Natur von Wordpress nicht wirklich ändern, aber ich schätze die Hilfe. – Incognito

+0

aus irgendeinem Grund verlangsamt der Index, den Sie erwähnten, die gesamte Abfrage. Mysql scheint die Join-Reihenfolge der Tabellen zu ändern, wobei die Ausführungszeit mindestens 4x länger ist. Ich bin mir nicht sicher, warum, obwohl explain Extended zeigt, dass der Index nicht verwendet wird. – Incognito

+0

@Incognito: Ok, es war nur ein Versuch. Um herauszufinden, wohin die Zeit geht, führen Sie die Abfrage inkrementell aus. Zuerst wähle SELECT ID FROM wp_posts WHERE ... und füge dann die JOINs einzeln hinzu. Vielleicht hilft das, das Problem zu erkennen. – Tomalak

Verwandte Themen