MySQL 获取至少有一个关联行的所有行的最有效方法

MySQL Most efficient way to get all rows with at least one associated row

给定一个 table members 和一个 table devices,其中每个成员可以拥有 0-many 设备,获得所有成员的最快方法是什么至少有一台设备?

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)

"INNER JOIN" returns 行,当两个表中都匹配时。你可以这样做:

SELECT m.*, md.*
FROM members m
INNER JOIN devices md ON m.memberId = md.memberId