2010-07-20 82 views
3

我在我的网站上运行积分系统,所以我需要将我的用户的不同动作日志保存到数据库中。问题是,我有太多的用户,并永久保留所有的记录可能会导致服务器过载...我有一种方法来保持每个用户只有10条记录,并自动删除较旧的条目? MySQL有这个功能吗?每个用户只保留10条记录

在此先感谢

+3

你怎么知道它是超载?有什么症状?在决定解决方案之前,您应该收集一些统计数据。 – 2010-07-20 15:01:21

+0

我很好奇,你有几个用户? – 2010-07-20 15:12:42

回答

2

只要运行该删除第11每小时cron作业 - N条记录。

+0

我的公司在一个4百万记录文件上取得巨大成功。 – bpeterson76 2010-07-20 15:27:50

2

在插入记录之前,您可以检查用户首先有多少。如果他们有> = 10删除最老的一个。然后插入新的。

+3

最好用触发器完成... – 2010-07-20 15:04:29

0
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table WHERE USER_ID = 1) AND USER_ID = 1 

更清晰的版本

DELETE FROM Table 
    WHERE ID NOT IN 
    (
     SELECT TOP 10 ID FROM Table WHERE USER_ID = 1 
    ) 
    AND USER_ID = 1 
0

当你插入一个用户的新纪录。只要做到这样的查询(不要忘了where -condition)前:

DELETE FROM tablename WHERE userID = 'currentUserId' LIMIT 9, 999999 

可以插入新的数据之后。这将数据始终保存到每个用户的十条记录。

INSERT INTO tablename VALUES(....) 
1

如果你的目标是让数据库确保给定表有从来没有超过每一个给定的子项(用户),那么N行更要解决这将是正确的方法之一:

如果您已经在使用存储过程进行数据访问,那么修改插入过程将最有意义,否则触发器将是最简单的解决方案。

或者,如果您的目标是定期移除旧数据,那么使用cron作业来启动存储过程以修剪旧数据将最有意义。

3

您可以添加一个触发器,负责删除旧条目。 例如,

DELIMITER // 
CREATE definer='root'@'localhost' TRIGGER afterMytableInsert AFTER INSERT ON MyTable 
FOR EACH ROW 
BEGIN 
    DELETE FROM MyTable WHERE user_id = NEW.user_id AND id NOT IN 
    (SELECT id FROM MyTable WHERE user_id = NEW.user_id ORDER BY action_time DESC LIMIT 10); 
END//