Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大型表和联接的MySQL性能问题_Mysql_Sql_Performance_Join_Large Data - Fatal编程技术网

大型表和联接的MySQL性能问题

大型表和联接的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的查询快。 问题是,当我取消这个限制时,查询的时间真的太长了。。我试着离开了几个

我有三个表,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?请添加括号以澄清;然后检查您是否仍然得到“正确”的结果。