MySQL LEFT OUTER JOIN加速查询

时间:2013-04-18 21:28:28

标签: mysql sql

有人可以告诉我如何编写以下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非常慢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

我假设您正在尝试获取所有url_source_wp记录,这些记录在url_done_wp表中由FK url_source_wp引用的id为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