def*_*fuz 11 mysql performance inner-join distinct explain
例如,我有3个表:user,group和permission,和他们之间有两个many2many关系:user_groups和group_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
| 归档时间: |
|
| 查看次数: |
6369 次 |
| 最近记录: |