Может кто-нибудь сказать мне, как я пишу следующий 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 очень медленный.
Медленный запрос обычно означает отсутствие (собственных) индексов. Добавьте в свой вопрос инструкции 'CREATE TABLE', поэтому мы знаем, какие индексы существуют. Также вывод «EXPLAIN». Ваш первый запрос кажется хорошим и хорошо написанным. –
Действительно ... null-join («найти строку, такую, что возможное объединение не существует») в ответе WoLpH обычно лучше, чем подзапрос в MySQL, но с учетом разумных индексов (например, на 'url_group') и предполагая, что (независимые) результаты подзапроса не смехотворно огромны, я бы не ожидал, что это будет *, что медленно ... – bobince
Подзапрос может привести к появлению миллионов строк. – user2296949