大表和联接的MySQL性能问题

时间:2017-04-12 20:58:18

标签: mysql sql performance join large-data

我有三个表,wp_posts(60000条记录),wp_postmeta(130000条记录)和news_news_obj(70000条记录)。 我想找到表wp_posts中缺少的news_news_obj表中的所有帖子。 与news_news_obj.id进行比较,每个帖子都有一个自定义字段,位于wp_postmeta表(oldpostid)中。

我首先使用下面的2个查询尝试了限制30,而使用NOT IN的那个查询比使用联接更快。 问题是,当我删除LIMIT时,查询需要花费太长时间..我试着离开它几个小时并且它没有返回任何结果。

我可以为这类问题和大数据做些什么?

任何帮助表示赞赏!

第一个带有连接的查询:

SELECT  meta2.id, meta2.title, meta2.main_text
    FROM  wp_posts
    INNER JOIN  wp_postmeta meta1  ON meta1.post_id = wp_posts.ID
      AND  meta1.meta_key = 'oldpostid'
      AND  wp_posts.post_type = 'post'
    RIGHT JOIN  news_news_obj meta2  ON meta1.meta_value = meta2.id
    WHERE  meta1.meta_value IS NULL 

我尝试使用NOT IN的第二个查询:

SELECT  news_news_obj.id, news_news_obj.title, news_news_obj.main_text
    FROM  news_news_obj
    WHERE  news_news_obj.id NOT IN (
        SELECT  wp_postmeta.meta_value
            FROM  wp_posts, wp_postmeta
            WHERE  wp_posts.ID = wp_postmeta.post_id
              AND  wp_postmeta.meta_key = 'oldpostid'
              AND  wp_postmeta.meta_value = news_news_obj.id
              AND  wp_posts.post_status = 'publish'
              AND  wp_posts.post_type = 'post'
                          ) 

1 个答案:

答案 0 :(得分:0)

(参见我的评论,加上......)

所需索引:

posts:  INDEX(post_status, post_type, ID)
posts:  INDEX(post_type, ID)
postmeta:  PRIMARY KEY(post_id, meta_key)

这两个查询可能会得到不同的结果,因为只有一个

AND  wp_posts.post_status = 'publish'