您已经回答这两个查询将显示相同的结果和各种意见,其中一个更有效。
我的观点是,效率(速度)会有所不同,只有当优化器为 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
- 在应用之前还有其他方法可以实现相同的 (to
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 种方法中哪一种更快取决于您的表大小和许多其他因素,因此最好使用您的数据进行测试。