2013-04-18 5 views
-1

Может кто-нибудь сказать мне, как я пишу следующий SQL:MySQL LEFT OUTER JOIN ускорить запрос

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 очень медленный.

+0

Медленный запрос обычно означает отсутствие (собственных) индексов. Добавьте в свой вопрос инструкции 'CREATE TABLE', поэтому мы знаем, какие индексы существуют. Также вывод «EXPLAIN». Ваш первый запрос кажется хорошим и хорошо написанным. –

+0

Действительно ... null-join («найти строку, такую, что возможное объединение не существует») в ответе WoLpH обычно лучше, чем подзапрос в MySQL, но с учетом разумных индексов (например, на 'url_group') и предполагая, что (независимые) результаты подзапроса не смехотворно огромны, я бы не ожидал, что это будет *, что медленно ... – bobince

+0

Подзапрос может привести к появлению миллионов строк. – user2296949

ответ

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 
0

Вы не должны просто свести на нет два условия в ИНЕКЕ?

Я предполагаю, что вы пытаетесь получить все записи url_source_wp, ссылки на которые ссылаются в таблице url_done_wp на FK 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 
+1

Это не одно и то же. Исходный запрос - это «где в группе 4 нет URL-адреса», это «где есть URL-адрес в другой группе, кроме 4». – bobince