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
给定一个 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