如果给定一个表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/

10-13 03:19