You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:37:24