将最后N条消息存储到数据库的方法,其中将自动删除旧消息

时间:2013-05-25 19:05:55

标签: mysql database chat pusher

我有一个用推杆制作的聊天室应用程序。我想存储让我们说数据库(MySQL)上的最后10条消息。所以,会有频繁的写作。但是,只会存储10个,并且会删除任何旧邮件。

示例:

  1. 消息1到10将存储在数据库中
  2. 消息11进入,消息1将被删除
  3. 这些最后10封邮件只会在用户访问并首次登录聊天室时检索,以便他/她能够回读聊天室中最新的消息

    是否有一个共同的'实践'如何做到这一点或更好的方式?

3 个答案:

答案 0 :(得分:1)

我会考虑使用真正的mysql,我认为ram-database是一个更好的选择。至少使用内存引擎。

您可以创建一个after-insert-trigger来计算条目并删除最旧的条目。或者你创建一个删除最早的“太多”条目的cronjob。

另请参阅:https://stackoverflow.com/a/10017798/2277620

无论如何,select应该只读取limit 10的最后10个条目,如同在另一个答案中一样。

答案 1 :(得分:0)

性能最佳的MySQL解决方案将是以下......

首先,将您的表创建为InnoDB表,以防止在写入时锁定表。

CREATE TABLE chat_messages (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ....
    message VARCHAR(255) NOT NULL
) ENGINE=InnoDB;

可选地,在查询之前,您可能希望将事务隔离级别设置为“read uncommitted”,这不会等待在执行之前释放锁。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

然后,只需通过id DESC和LIMIT 10排序查询最后10条记录。这将非常快,因为它使用聚集索引(主键)进行排序。

SELECT * 
FROM chat_messages
ORDER BY id DESC LIMIT 10

最后,您可以在夜晚的cron上运行清理过程,以便在活动较少时删除聊天消息。

0 0 * * * mysql -hlocalhost -uusername -ppassword -e "DELETE FROM chat_messages WHERE id < (SELECT MAX(id) - 10 FROM chat_messages)"

答案 2 :(得分:0)

我很想接受上述任何一种情况。

或者,如果超过10,则可以使用insert上的触发器来删除记录。

或者如果您对没有cron作业访问权限的计划清理作业感到满意,那么您可以使用MySQL中的预定事件。