大型表和联接的MySQL性能问题
我有三个表,wp_posts60000条记录,wp_postmeta130000条记录和news_news_obj70000条记录。 我想从news_news_obj表中查找wp_posts表中缺少的所有帖子。 比较是与news_news_obj.id和每个posts在wp_postETA表oldpostid中都有一个自定义字段进行的 我尝试了下面的两个查询,第一个是限制为30的查询,有NOT IN的查询比有JOIN的查询快。 问题是,当我取消这个限制时,查询的时间真的太长了。。我试着离开了几个小时,它没有返回任何结果 我能为这种问题和如此大的数据做些什么 感谢您的帮助 具有联接的第一个查询:大型表和联接的MySQL性能问题,mysql,sql,performance,join,large-data,Mysql,Sql,Performance,Join,Large Data,我有三个表,wp_posts60000条记录,wp_postmeta130000条记录和news_news_obj70000条记录。 我想从news_news_obj表中查找wp_posts表中缺少的所有帖子。 比较是与news_news_obj.id和每个posts在wp_postETA表oldpostid中都有一个自定义字段进行的 我尝试了下面的两个查询,第一个是限制为30的查询,有NOT IN的查询比有JOIN的查询快。 问题是,当我取消这个限制时,查询的时间真的太长了。。我试着离开了几个
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
我尝试的第二个查询不在:
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'
)
看我的评论,还有 所需索引:
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'
第二个查询关心“发布”而第一个查询不关心,这有什么原因吗?而且,考虑到表格的大小,我并不肯定;但是在第二个版本中,从子查询中取出和wp_postmeta.meta_value=news_news_obj.id可能会有所帮助,因为它不再是一个相关子查询,mysql可以为每个外部行处理子查询一次,而不是一次。没有任何原因,我只是忘记了将其添加到第一个查询中。目前,我主要关心的是在合理的时间限制内获得其中一个查询的结果。因为这是我正在检查第二个表中是否存在帖子的部分。如果我删除此部分,您知道如何以不同的方式完成吗?请提供解释选择。。。对于不在和加入-我想看看你为什么会有不同。另外,您使用的是哪个版本的MySQL?是从x内部连接y右连接z还是从x内部连接y右连接z?请添加括号以澄清;然后检查您是否仍然得到“正确”的结果。