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

def*_*fuz 11 mysql performance inner-join distinct explain

例如,我有3个表:user,grouppermission,和他们之间有两个many2many关系: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 
Run Code Online (Sandbox Code Playgroud)

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

在这个情况下,你会怎么做?为什么?谢谢!

Dad*_*gas 13

使用EXISTS而不是DISTINCT

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

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

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

  • 在找到第一行后,Exists也会返回,因此您可以节省的不仅仅是排序; 还扫描. (4认同)