如何优化此查询?

时间:2010-03-18 15:02:03

标签: mysql

SELECT DISTINCT wposts.* 
    FROM wp_2_posts wposts, wp_2_postmeta wpostmeta, wp_2_postmeta wpostmeta1, wp_2_term_taxonomy, wp_2_terms, wp_2_term_relationships
    WHERE wposts.ID = wpostmeta.post_id
    AND wp_2_terms.term_id = '8'
    AND wp_2_term_taxonomy.term_id = wp_2_terms.term_id
    AND wp_2_term_taxonomy.term_taxonomy_id = wp_2_term_relationships.term_taxonomy_id
    AND wp_2_term_relationships.object_id = wposts.ID
    AND wpostmeta.meta_key = 'validity'
    AND wpostmeta.meta_value > '".$logic_date."'    
AND wpostmeta1.meta_key != 'permanent'  
    AND wposts.post_status = 'publish' 
    AND wposts.post_type = 'post'
    ORDER BY wposts.post_date DESC

到目前为止,很好的建议,继续使用第二个meta_key的“进化”查询!='permanent_listing'

SELECT wposts。*    FROM wp_2_posts wposts LEFT JOIN wp_2_postmeta wpostmeta ON wposts.ID = wpostmeta.post_id    LEFT JOIN wp_2_term_relationships wrelationships on wrelationships.object_id = wposts.ID    LEFT JOIN wp_2_term_taxonomy wtaxonomy on wtaxonomy.term_taxonomy_id = wrelationships.term_taxonomy_id    LEFT JOIN wp_2_terms wterms ON wtaxonomy.term_id = wterms.term_id    哪里     wterms.term_id ='--category id here--'AND     wpostmeta.meta_key ='wpx_validity'AND     wpostmeta.meta_value> ' - 今天约会 - '和     wpostmeta.meta_key!='permanent_listing'AND     wposts.post_status ='发布'AND     wposts.post_type ='post'     ORDER BY wposts.post_date DESC

LEFT JOIN和INNER JOIN似乎做同样的事情。 存在以下索引:wp_2_terms.term_id,wp_term_taxonomy.term_taxonomy_id,wp_2_term_relationships.object_id wp_2_postmeta有一个meta_id索引和字段:post_id,meta_key,meta_value。

此查询正在WPMU上运行。

4 个答案:

答案 0 :(得分:3)

首先,我建议您使用INNER JOIN语法来连接表:

SELECT table1.c1, table2.c2 FROM table1
  INNER JOIN table2 ON table1.ck = table2.ck

此外,您应该避免使用*运算符并仔细选择所需的列。 DISTINCT也会降低查询速度。你真的需要吗?

答案 1 :(得分:1)

首先,您的wpostmeta1不会加入任何内容。

其次,您不需要DISTINCT,您需要IN

试试这个:

SELECT  wposts.* 
FROM    wp_2_posts wposts
JOIN    wp_2_postmeta wpostmeta
ON      wpostmeta.post_id = wposts.ID
        AND wpostmeta.meta_key = 'validity'
        AND wpostmeta.meta_value > '".$logic_date."'
JOIN    wp_2_postmeta wpostmeta1,
ON      wpostmeta1.post_id = wposts.ID
        AND wpostmeta1.meta_key != 'permanent'  
WHERE   wposts.ID IN
        (
        SELECT  wp_2_term_relationships.object_id
        FROM    wp_2_term_relationships
        JOIN    wp_2_term_taxonomy
        ON      wp_2_term_taxonomy.term_taxonomy_id = wp_2_term_relationships.term_taxonomy_id
        WHERE   wp_2_term_taxonomy.term_id = '8'
        )
        AND wposts.post_status = 'publish' 
        AND wposts.post_type = 'post'
ORDER BYc
        wposts.post_date DESC

创建以下索引(或确保它们存在):

wp_2_term_relationships (object_id, term_taxonomy_id)
wp_2_term_taxonomy (term_taxonomy_id, term_id)
wp_2_posts (post_status, post_type, post_date, id)

答案 2 :(得分:0)

如果查询太慢, 有不同的解决方案。

首先尝试创建一些索引,

然后尝试减少使用php过滤某些数据的连接。

如果它仍然很慢,可能是数据库模式错误,应该更改。

答案 3 :(得分:0)

我敢打赌你5美元这是一个索引问题。我要做的第一件事就是确保你加入表格的所有字段都被编入索引。