如果给定一个表members
和一个表devices
,其中每个成员可以有0个设备,那么获取所有至少有一个设备的成员的最快方法是什么?
select m.*, md.* from members m
left join (
SELECT count(*) as c, memberId from member_devices d GROUP BY d.memberId
) md ON m.memberId = md.memberId
WHERE md.c > 0
这很管用,但看起来很慢。
select s.* from members m where
EXISTS (
SELECT 1 FROM member_devices md WHERE m.memberId = md.memberId
)
同样有效,而且可能更快一些(?)
有没有人有经验?谢谢!
最佳答案
第二个选项将EXISTS
与相关的子查询一起使用,它无疑是这里最快的选项。
与其他选项不同,它不需要聚合和连接聚合是一种昂贵的操作,通常伸缩性不好(当要处理的记录数增加时,性能往往会急剧下降)。
而且,实际上不需要计算每个组中有多少条记录。您只想知道是否至少有一个记录可用。这正是EXISTS
的目的。
为了提高查询的性能,请确保具有以下索引(如果正确实现了与外键的关系,这些索引可能已经存在):
members(memberId)
member_devices(memberId)
关于mysql - MySQL最有效的方式来获取具有至少一个关联行的所有行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58826857/