【发布时间】:2015-02-25 04:36:42
【问题描述】:
我目前正忙于弄清楚如何有效地计算应用程序上任何给定“页面”上的活跃用户数量。我正在使用 PostgreSQL 并且有一个这样的表:
CREATE TABLE user_is_viewing_page (
user_id BIGINT,
page_id BIGINT,
timestamp TIMESTAMP
);
每个用户将每隔 10 秒左右使用他们正在查看的页面的 id 向服务器发送 POST,并将新行插入到数据库中。
我必须计算任何给定页面上“活跃”用户数量的当前查询是:
SELECT COUNT(DISTINCT user_id)
FROM user_is_viewing_page WHERE page_id = 1
AND timestamp > CURRENT_TIMESTAMP - INTERVAL '10 seconds';
我想知道使用此查询最有效的方法是什么。请记住,我需要经常访问此计数(每页每 5-10 秒)。
- 是否应该使用查询创建实体化视图? (知道我必须经常访问它)
- 是否应该在每次需要时自行运行查询?
- 为我的表建立索引以实现快速查找的最佳方法是什么?
【问题讨论】:
-
为什么需要经常访问它?通常,您只关心汇总统计信息。如果您通过范围表“批量处理”查询(即,使用 CTE 声明包含
(CURRENT_TIMESTAMP, CURRENT_TIMESTAMP - 10 SECONDS), (CURRENT_TIMESTAMP - 10 SECONDS, CURRENT_TIMESTAMP - 20 SECONDS)...的“临时”表,然后您也可以按该表进行分组)等,您可能会获得更好的性能。 -
我需要提供当前正在查看页面的用户数量的伪实时更新。所以不幸的是,像这样简单地运行一个查询是行不通的。
标签: sql performance postgresql indexing postgresql-performance