Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何确定什么更有效:不同的还是存在的?_Mysql_Performance_Distinct_Inner Join_Explain - Fatal编程技术网

Mysql 如何确定什么更有效:不同的还是存在的?

Mysql 如何确定什么更有效:不同的还是存在的?,mysql,performance,distinct,inner-join,explain,Mysql,Performance,Distinct,Inner Join,Explain,例如,我有3个表:用户、组和权限,它们之间有两个多个关系:用户组和组权限 我需要选择给定用户的所有权限,不重复。每次遇到类似问题时,我都无法确定哪个版本的查询更好: SELECT permisson_id FROM group_permission WHERE EXISTS( SELECT 1 FROM user_groups WHERE user_groups.user_id = 42 AND user_groups.group_id = gro

例如,我有3个表:
用户
权限
,它们之间有两个多个关系:
用户组
组权限

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

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 

我有足够的经验在解释的基础上得出结论。第一个查询有子查询,但我的经验表明第一个查询更快。可能是因为结果中过滤了大量权限

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

使用是存在的,而不是不同的

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

在您的情况下,将有许多重复的数据,因此存在的数据应该更快


通过

您是否检查了这两个项目的
explain
计划?我有足够的经验根据explain得出结论。第一个查询有子查询,但我的经验表明第一个查询更快。可能是因为要过滤的
权限的数量很大。第二个权限的性能最好。子查询“否”很快。@yes要避免子查询;但是,
EXISTS
指示服务器在找到第一个匹配项后停止查找,这使得它成为一个非常快速的WHERE条件。EXISTS在找到第一行后也会返回,因此您保存的不仅仅是排序;还有扫描。