根据另一表统计行数筛选会议的SQL查询写法优化咨询
你当前写的关联子查询写法逻辑完全正确,但会议表数据量较大时会触发多次参会人表的遍历统计,性能表现一般,下面是两种更优的实现方案:
方案1:LEFT JOIN + 分组聚合(适合需要同步返回参会人数的场景)
SELECT m.* FROM meetings m LEFT JOIN meeting_attendees ma ON m.id = ma.meeting_id GROUP BY m.id HAVING m.max_size IS NULL OR COUNT(ma.meeting_id) < m.max_size;
- 优势:如果需要同步返回参会人数字段,只需要在SELECT语句中新增
COUNT(ma.meeting_id) AS attendee_count即可,一次查询就能拿到所有需要的信息 - 注意点:需要确保
meetings.id是表主键,否则开启了严格分组模式的数据库(比如开启ONLY_FULL_GROUP_BY的MySQL)会要求GROUP BY子句补全所有选中的meetings表字段
方案2:EXISTS半连接(适合仅需筛选会议信息、不需要返回参会人数的场景,性能最优)
SELECT * FROM meetings m WHERE m.max_size IS NULL OR EXISTS ( SELECT 1 FROM meeting_attendees ma WHERE ma.meeting_id = m.id HAVING COUNT(*) < m.max_size );
- 优势:半连接不需要返回参会人表的完整匹配结果,数据库内部可以提前终止计数流程,比原始子查询性能高很多,尤其是参会人表数据量大的时候优化效果更明显
- 通用优化建议:给
meeting_attendees.meeting_id字段添加普通索引,上述两种方案的执行效率都会有大幅提升
内容的提问来源于stack exchange,提问作者user1354934
相关产品推荐
相关产品推荐

