在哪里存储用户访问过的页面?

时间:2010-05-25 17:53:50

标签: mysql

我有一个项目,例如我有帖子。 接下来的任务是:我必须向用户显示他上次访问的帖子。 这是我的解决方案:每次用户访问新主题(对他而言)时,我都会在表visits中创建一条新记录。 表visits具有下一个结构:id,user_id,post_id,last_visit。 现在我的表visits有大约14,000,000条记录,而且它每天都在增长。 可能是我的解决方案不是最优的,并存在另一种如何存储用户访问的方式? 将每次访问保存为独立记录非常重要,因为我还具有选择和使用用户访问权限的功能。我不能清除这个表,因为可能需要在一个月,一年后的数据。我如何才能优化这种情况?

6 个答案:

答案 0 :(得分:1)

不,除了将访问数据存储在一个表格中,除了用户ID,帖子ID和时间戳(如果你需要跟踪每个人的最后一次)时,你真的没有多少选择。用户访问了每个帖子。

我怀疑你是否需要在该表中使用id字段,而不是在(user_id, post_id)上使用复合键,但我希望它会产生轻微影响,前提是你已经有了(user_id, post_id)上的唯一索引。 (如果在这对字段上没有索引,添加一个字段应该可以显着提高查询性能并使其成为唯一索引或复合键,以防止意外插入重复记录。)

如果性能仍然是一个问题,尽管正确的索引,你应该能够通过将表分割成一个较小的表的集合,但通过user_id或post_id(而不是之前的答案建议的日期)来改善它)。如果您按用户或帖子ID分解,那么您仍然可以确定给定用户之前是否已查看过某个帖子,如果是,则仅确定一个查询的日期。如果按日期对其进行细分,那么该信息将分布在所有表格中,并且在最糟糕的情况下,如果用户以前从未查看过帖子(我希望相当普遍),则需要单独进行在得到确定答案之前查询每个表。

至于是按照用户ID还是通过帖子ID对其进行细分,这取决于您是否更频繁地查找用户查看的所有帖子(按user_id分段以在一个查询中获取所有帖子)或所有用户查看过帖子(按post_id分段)。

答案 1 :(得分:0)

如果它不需要持久,您可以将其存储在会话中。如果是这样,您可以按表分开记录,例如每月1次,或者您只能存储最后访问的5-10页,并在新的页面进入时删除旧记录。您也可以将其更改为页面本周访问,本周等。

答案 2 :(得分:0)

如果您确实需要所有1400万条记录,我会创建另一个历史表来存档与日常网站操作不相关的访问。

在月末(或周或季度等等)有一些计划逻辑,用于将超出某个截止点的记录存档到历史表中,并减少“实时”表中的记录数。这应该有助于提高“实时”表的查询速度,因为你的记录会更少。

如果您确实需要查询所有数据,则可以使用这两个表并将所有数据都提供给您。

答案 3 :(得分:0)

你可以删除你不需要的那些 - 如果你只想显示最近10个访问过的帖子那么

DELETE FROM visits WHERE user_id = ? AND id NOT IN (SELECT id from visits where user_id = ? ORDER BY last_visit DESC LIMIT 0, 10);

(我认为这是进行该查询的最佳方式,任何mysql大师都可以告诉我吗?你可以在DELETE中进行ORDER BY但是LIMIT只需要1个参数,所以你不能在那里做LIMIT 10,100)< / p> 插入/更新每个新行后

,如果您愿意,则每隔几天

答案 4 :(得分:0)

为您的vists表创建一个类似(id,user_id,post_id,last_visit)的结构,使其显示为保存所有帖子,而不仅仅是每个主题的最后一个帖子。你不需要在某个地方使用主题ID,以便你可以确定PER TOPIC的最后一个帖子是什么,所以你知道当他们在同一主题中多次发帖时要替换哪一行?

答案 5 :(得分:0)

将post_ids存储到$ _SESSION,然后使用MYSQL IN和一个SELECT查询,您将能够显示他访问过的帖子。但是在会员关闭浏览器之后,所有这些ID都将被销毁,但无论如何,这比使用数据库更加快速和优化。

编辑:抱歉,我没有注意到您必须将这些记录存储在数据库中并在数月后使用它。然后我不知道如何优化它,但有14毫升。记录你肯定应该使用索引。