2つのクエリで同じ結果が表示され、どちらかがより効率的なさまざまな意見が表示されるという回答はすでにあります。
私の意見では、オプティマイザーが2つのクエリに対して異なる計画を実行した場合にのみ、効率(速度)に違いが生じます。最新のMySQLバージョンでは、オプティマイザーはどちらのクエリでも同じプランを見つけるのに十分賢いので、まったく違いはありませんが、もちろん、EXPLAINを使用して実行プランをテストして確認するか、一部のクエリに対して2つのクエリを実行できます。テストテーブル。
安全のために、とにかく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
適用する前に同じ(to)サブ結果を達成する他の方法もあります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つの方法のどちらが速いかは、テーブルサイズや他の多くの要因によって異なるため、データを使用してテストすることをお勧めします。