我有一个用推杆制作的聊天室应用程序。我想存储让我们说数据库(MySQL)上的最后10条消息。所以,会有频繁的写作。但是,只会存储10个,并且会删除任何旧邮件。
示例:
这些最后10封邮件只会在用户访问并首次登录聊天室时检索,以便他/她能够回读聊天室中最新的消息
是否有一个共同的'实践'如何做到这一点或更好的方式?
答案 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中的预定事件。