我正在做一个项目,我正在跟踪网站上的用户,我在网站上记录他们的每一个命中。每当他们点击一个URL时,我都会在数据库中创建它,并使用一些标签对其进行标记。按加入查询中的日期进行排序和计算
每个网址在我的数据库中都被命名为“资源”,并且资源可以使用多个标记进行标记。访问者在访问URL时连接到资源,当用户访问资源时,我也将日期连接到它。
我想要做的事情是找到具有正确标签的资源,这些资源在本月或今天已被观看。
我目前正在建设的查询是在这里:
SELECT r.resource_id, r.resource_url
FROM resource r
JOIN visitor_resource vt ON vt.resource_id = r.resource_id
JOIN resource_tags rt ON rt.resource_id = vt.resource_id
JOIN tags t ON t.tag_id = rt.tag_id AND t.tag_name = '42'
GROUP BY r.resource_id
为了给你一个想法的结构,你可以在这里看到: tracking database structure http://kaspergrubbe.dk/db-overview.png
所以基本上我会到那里算多少visitor_resources通过查看上个月的visitor_resources.last_visited并在5个访问量最高的资源中查找。
如何解决这个问题?
上面的查询似乎也很慢没有查询缓存,我怀疑这是因为t.tag_name不是一个索引,这是一个varchar,但有无论如何加快进程,而不是添加此索引?
谢谢。
如果你只存储last_visited日期,这实际上并不会告诉你的资源了多少次访问。在我猜测的同一个月中,访问者可能会不止一次地访问资源。也许没关系,你只关心独特的访问者,但我想我应该指出。 – 2011-05-20 15:04:32
感谢您指出,但这是设计:) – 2011-05-20 15:20:51