今天 在本地 m1 的mac 上压测了一下 GooseForum 如果有10w帖子会有什么性能问题(因为采用的sqlite)。 一开始还好。 后面出现了两个问题,第一个问题是如果高频写入帖子的时候,这时候查看帖子的接口里面更新浏览量的逻辑会导致并发下降(只是下降还能接受,这里后面可以采用集中写入或者其他方式统计,和主sqlite分隔开就好)。另一个问题就很嗨皮了,因为 GooseForum 是支持多板块聚合查看的, 本地压测的时候直接 GG了,sql全堵在一起了。 这是之前的sql的简化版本,大概这个意思,既要聚合还要去重复。搜索资料是因为产生了临时表,量少的时候不敏感,量大了,直接GG了。
SELECT DISTINCT a.*
FROM articles a
JOIN article_category_rs rs ON a.id = rs.article_id
WHERE rs.article_category_id IN (6,7) AND rs.effective = 1;
优化了多个版本,发现 使用 EXISTS 简直重获新生,10w 的时候聚合搜索直接阻塞主了,基本上可以说高访问下服务无法访问了。新sql 如下
SELECT a.*
FROM articles a
WHERE EXISTS (
SELECT 1
FROM article_category_rs rs
WHERE rs.article_id = a.id
AND rs.article_category_id IN (6,7)
AND rs.effective = 1
);
因为 关系表中的字段不会用来展示,文章表有冗余字段来显示分类,所以直接 EXISTS
重获新生了。在本地m4测了一下运行良好(本地没有写入这么多数据,不过m1电脑上测试的时候但是效果很好,基本恢复到正常水平几千qps)。