繁体   English   中英

MySQL LEFT OUTER JOIN加快查询速度

[英]MySQL LEFT OUTER JOIN to speed up query

有人可以告诉我如何编写以下SQL:

SELECT url_source_wp.url 
FROM url_source_wp 
WHERE url_source_wp.id NOT IN (
  SELECT url_done_wp.url_source_wp
  FROM url_done_wp 
  WHERE (url_done_wp.url_group = 4) AND (hash IS NULL)) LIMIT 50;

使用联接?

我试过了:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp
WHERE url_done_wp.url_group = 4 AND url_source_wp.hash is NULL LIMIT 50

但是答案是不一样的。

问题在于,第一个SQL非常慢。

我相信您正在寻找这样的东西:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp
    ON url_source_wp.id = url_done_wp.url_source_wp AND url_done_wp.url_group = 4 AND hash IS NULL
WHERE url_done_wp.url_source_wp IS NULL
LIMIT 50

您不应该否定WHERE子句中的两个条件吗?

我假设您正在尝试获取FK url_source_wp在url_done_wp表中引用其ID的所有url_source_wp记录,这些记录的url_group = 4且其哈希列为NOT NULL,因为您使用了带有NOT IN的子查询。 INNER JOIN应该很好。

因此应该是:

SELECT url_source_wp.url 
FROM url_source_wp 
INNER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp
WHERE url_done_wp.url_group != 4 AND url_source_wp.hash IS NOT NULL LIMIT 50

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM