我需要确定用户是否已访问过某个页面,以便跟踪唯一的网页浏览量.
我已经实现了一些HTTP头缓存,但现在我需要优化SQL查询.
这次访问是独一无二的,时间:
> pair:page_id user_id在访问表中找到
>或pair:找到page_id session_id
>或:page_id [ip useragent] – (这是另一个讨论的话题,是否只应该是ip或ip useragent)
所以我有一个跟踪用户访问的表格:
visit:
page_id
user_id
session_id
useragent
ip
created_at
updated_at
现在每次用户访问(没有点击缓存)我会更新一行(如果存在).如果有任何受影响的行,我将插入新的访问表.
这是一个或两个查询(假设缓存将起作用,主要是两个查询),但行数以某种方式受到限制.也许最好存储所有访问,然后在例如清理数据库中清理数据库.一个月?
问题是:
>应该如何构造访问表(键,索引,与用户和page_views表的关系).一些重要的字段可能为null(例如user_id),那么索引呢?我需要多列主键吗?
>哪个是查找唯一用户最快的SQL查询?
>这是理智的做法吗?
我使用PostgreSQL和PDO(Doctrine ORM).
我的所有会话都存储在同一个数据库中.
最佳答案 我个人不会把它放在请求 – 响应路径中.我会将原始数据记录在表中(或将其推送到队列中)并让后台任务/线程/ cron作业处理.
然后队列(或消息传递表)应该只包含pageid,userip,sessionid,useragen,ip.
只要后台任务可以跟上,绝对时间就不那么重要了.由于单个线程现在将执行繁重的工作,因此在更新唯一的网页浏览表时不会产生冲突的锁.