我有三个表,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'
)
答案 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'