Mysql 如何确定什么更有效:不同的还是存在的?
例如,我有3个表: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
用户
、组
和权限
,它们之间有两个多个关系:用户组
和组权限
我需要选择给定用户的所有权限,不重复。每次遇到类似问题时,我都无法确定哪个版本的查询更好:
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在找到第一行后也会返回,因此您保存的不仅仅是排序;还有扫描。