如何确定哪些更有效:DISTINCT还是EXES EXISTS?

时间:2012-08-30 16:58:19

标签: mysql performance distinct inner-join explain

例如,我有3个表:usergrouppermission,以及它们之间的两个很多关系:user_groupsgroup_permissions

我需要选择给定用户的所有权限,而不重复。每次遇到类似问题时,我都无法更好地确定哪个版本的查询:

SELECT permisson_id FROM group_permission WHERE EXISTS(
    SELECT 1 FROM user_groups 
        WHERE user_groups.user_id = 42 
          AND user_groups.group_id = group_permission.group_id
)

SELECT DISTINCT permisson_id FROM group_permission
    INNER JOIN user_groups ON user_groups.user_id = 42 
           AND user_groups.group_id = group_permission.group_id 

我有足够的经验可以根据解释得出结论。第一个查询有子查询,但我的经验表明第一个查询更快。也许是因为结果中有大量过滤后的权限。

在这种情况下你会做什么?为什么? 谢谢!

1 个答案:

答案 0 :(得分:13)

使用EXISTS而不是DISTINCT

您可以使用DISTINCT禁止显示重复的行;您使用EXISTS来检查子查询返回的行是否存在。只要有可能,您应该使用EXISTS而不是DISTINCT,因为DISTINCT会在抑制重复行之前对检索到的行进行排序。

在你的情况下,应该有许多重复的数据,所以存在应该更快。

http://my.safaribooksonline.com/book/-/9780072229813/high-performance-sql-tuning/ch16lev1sec10