SQL计数与过滤查询优化:article_bookmarks表查询语句优化
优化文章收藏统计与用户收藏状态查询的SQL语句
原查询通过主统计+子查询判断的方式,会对article_bookmarks表中同一articleId范围的数据进行两次扫描,在数据量较大时效率偏低。可以通过单次扫描表+聚合函数的方式优化,只需要读取一次目标数据即可同时得到两个结果:
优化写法(兼容大部分数据库)
SELECT COUNT(userId) AS bookmark_count, COALESCE(MAX(CASE WHEN userId = :userId THEN 1 ELSE 0 END), 0) AS user_bookmarked FROM article_bookmarks WHERE articleId = :articleId
逻辑说明
COUNT(userId):直接统计当前文章的总收藏数,即使没有收藏记录也会返回0(COUNT函数在无匹配行时默认返回0)。MAX(CASE WHEN userId = :userId THEN 1 ELSE 0 END):遍历所有收藏记录,只要存在当前用户的记录就返回1,否则返回0;用COALESCE处理无收藏记录时的NULL情况,确保返回0,和原查询行为完全一致。
关键性能优化:添加复合索引
不管用哪种写法,都必须给article_bookmarks表建立复合索引:
CREATE INDEX idx_article_user ON article_bookmarks(articleId, userId);
这个索引包含了查询所需的所有字段,查询时可以直接从索引获取数据,无需回表扫描,能大幅提升查询速度。
内容的提问来源于stack exchange,提问作者DaHoC
相关产品推荐
相关产品推荐

