我希望在我们的生产站点中添加一项新功能,该功能将向用户显示他们最近查看的 25 个项目。我已经根据项目类型将每个视图记录到各种表中,但是查询这些表的并集效率不高,因为这些表(在某些情况下)有数百万行,对于新表,我是只关注用户最近的25次浏览。
我最初的想法是创建一个新表并编写额外的代码来向该表添加(和删除)记录,条件如下:
1) user_id 和 item_id 的每个组合应该是唯一的;即对于给定的 user_id,任何项目都不应出现超过一次
2) 为了保持表小/快,为给定用户存储的项目不应超过 25 个。一旦 user_id 有 25 个项目,只要为该 user_id 添加新视图,就会删除最旧的视图。
所以为了做到这一点,我需要查询给定的组合是否存在,然后如果给定的 user_id 有 25 行,则需要删除用户最旧的行。
我认为可能有更好的方法来做到这一点,我调查了 MySQL“视图”,但从我读到的内容来看,基于现有表创建视图听起来效率不高,因为它会使用所有行但没有索引。
有没有更好的方法来做到这一点(也许是触发器?或者 mysql 模式中的某种方式?)或者我最好的选择是“蛮力”;创建额外的代码来管理新表,在我已经必须记录每个视图的代码之上?
这是新表的基本架构:
| Field | Type
+-----------------------+-----------------
| customer_id | int(11)
| item_id | int(11)
| view_date | datetime
提前感谢您的任何意见或建议。
我认为你的方法是合理的。因为它会显示在线数据(不需要后台处理)并且只会使用来自活动事务的资源(客户没有看到任何东西不需要重新处理他们的数据)。
我会使用触发器来做到这一点。您不必更改现有代码,并且可以更轻松地禁用/启用此新功能。
一个思路:尝试使用LRU算法。试着看看一个项目的“重要性”。例如,添加一个额外的列来计算一个项目被查看的次数。如果用户多次访问某个项目,您不能仅仅因为搜索了其他 24 个随机项目就停止在该 Top25 列表中显示它。
条件 1:您可以定义复合主键,例如:
然后您可以使用
INSERT ... ON DUPLICATE KEY UPDATE
例如:条件 2:触发器似乎是可行的方法。受到这个答案的启发,我写了这个未经测试的代码,它可能会完成这项工作(或者,至少,可以是一个好的开始):
编辑:忘记触发器内的 DELETE 条件。