首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提升查询性能

提升查询性能
EN

Stack Overflow用户
提问于 2020-02-19 21:42:14
回答 1查看 40关注 0票数 1

我正在构建一个论坛应用程序,用户可以在其中发布消息。这些信息可以被其他人看到。

表结构(简化):

代码语言:javascript
复制
// table: users
user_id | username | gender
---------------------------
1       | john     | m
2       | jane     | f
...

// table: posts
post_id | user_id | title
-------------------------
1       | 1       | Hello
...

// table: views
view_id | post_id | user_id | timestamp
---------------------------------------
1       | 1       | 2       | 2020-01-01 12:00:00
...

现在,我想创建一个查询来返回有关这个帖子的一些统计信息。我想获得唯一的视图(每次用户查看一个帖子,这是日志,但我只想计数所有用户一次),我想要得到的比例男性/女性。

代码语言:javascript
复制
SELECT
    title,
    (SELECT COUNT(DISTINCT user_id) FROM views WHERE post_id = 1) AS unique_views,
    (SELECT COUNT(user_id) FROM users WHERE gender = 'm' AND user_id IN (SELECT user_id FROM views WHERE post_id = 1) AS male_views,
    (SELECT COUNT(user_id) FROM users WHERE gender = 'f' AND user_id IN (SELECT user_id FROM views WHERE post_id = 1) AS female_views
FROM
    posts
WHERE
    post_id = 1

该查询工作正常,但它是一个包含5个子查询的查询。我还没有太多的数据可供测试,但我担心,如果我有+100万用户、+100万帖子和+1000万的浏览量,性能就会下降。

另一种方法是将查询完全拆分为多个查询:一个查询针对的是全部独特的视图,一个用于性别观点(具有不同的),但之后仍将是6个查询。

我使用postgresql,我有一个关于users.user_idusers.genderposts.post_idviews.view_idviews.post_id的索引。

问题:是否有另一种方法(例如,使用JOIN)来执行此查询,并且当数据库容量增加时性能会更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-19 21:50:55

您可以加入并执行条件聚合,而不是嵌套子查询:

代码语言:javascript
复制
select 
    p.title,
    count(distinct u.user_id) unique_views,
    count(u.user_id) filter(where u.gender = 'm') male_views,
    count(u.user_id) filter(where u.gender = 'f') female_views
from views v
inner join users u on u.user_id = v.user_id
inner join posts p on p.post_id = v.post_id
where p.post_id = 1
group by p.post_id, p.title
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60309699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档