2017-04-12 57 views
0

我有三個表,wp_posts(60000記錄),wp_postmeta(130000記錄)和news_news_obj(70000記錄)。 我想從wp_posts表中找到news_news_obj表中缺少的所有帖子。 與news_news_obj.id進行比較,每個帖子在wp_postmeta表(oldpostid)中都有一個自定義字段。與大表和連接MySQL性能問題

我試着用下面的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' 
         ) 
+0

是否有理由第二個查詢關心'發佈',第一個不是?另外,考慮到表格的大小,我並不積極;但從第二個版本的子查詢中取出'AND wp_postmeta.meta_value = news_news_obj.id'可能會有所幫助(因爲它不再是相關的子查詢,所以mysql可以爲每個外部行處理子查詢一次)。 – Uueerdo

+0

否沒有理由,我只是忘了將它添加到第一個查詢。現在我主要關心的是在合理的時間限制內,只要得到結果就可以完成其中一項查詢。 – Nikos

+0

因爲這是我檢查的部分,如果帖子存在於第二個表格中,您是否有任何想法,如果我刪除此部分,如何以不同的方式完成? – Nikos

回答

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'