У вас уже есть ответы, что два запроса будут показывать одинаковые результаты и различные мнения, для которых один является более эффективным.
Мое мнение состоит в том, что будет разница в эффективности (скорость), только в том случае, если оптимизатор даст разные планы для 2 запросов. Я думаю, что для последних версий MySQL оптимизаторы достаточно умны, чтобы найти один и тот же план для любого запроса, поэтому не будет никакой разницы , но, конечно, можно протестировать и увидеть либо планы выполнения с EXPLAIN или выполнение 2 запросов к некоторым тестовым таблицам.
Я бы в любом случае использовал вторую версию, просто чтобы быть в безопасности.
Позвольте мне добавить, что:
COUNT(*)
обычно более эффективен, чем COUNT(notNullableField)
в MySQL. Пока это не будет исправлено в будущих версиях MySQL, используйте COUNT(*)
, где это применимо.
Поэтому вы также можете использовать:
SELECT user_id
FROM forum_posts
WHERE user_id NOT IN
( SELECT user_id FROM banned_users )
GROUP BY user_id
HAVING COUNT(*) >= 100
- Существуют и другие способы достижения тех же (до
NOT IN
) промежуточных результатов перед применением GROUP BY
.
Использование LEFT JOIN / NULL
:
SELECT fp.user_id
FROM forum_posts AS fp
LEFT JOIN banned_users AS bu
ON bu.user_id = fp.user_id
WHERE bu.user_id IS NULL
GROUP BY fp.user_id
HAVING COUNT(*) >= 100
Использование NOT EXISTS
:
SELECT fp.user_id
FROM forum_posts AS fp
WHERE NOT EXISTS
( SELECT *
FROM banned_users AS bu
WHERE bu.user_id = fp.user_id
)
GROUP BY fp.user_id
HAVING COUNT(*) >= 100
Какой из 3 методов быстрее, зависит от размеров таблицы и множества других факторов, поэтому лучше всего проверить свои данные.