我有一个聊天室申请和推手做的。我想将最后10条消息存储在数据库(MySQL)上。因此,会有频繁的写作。但是,只有10条将被存储,任何旧消息都将被删除。
示例:
只有当用户第一次访问并登录到聊天室时,才能检索最后10条消息,以便他/她能够备份读取聊天室上的最新消息。
是否有一种常见的“实践”,如何做到这一点,或者更好的方式?
发布于 2013-05-25 19:11:24
对此最好的MySQL解决方案如下.
首先,将表创建为InnoDB表,以防止写入时的表锁。
CREATE TABLE chat_messages (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
....
message VARCHAR(255) NOT NULL
) ENGINE=InnoDB;另外,在查询之前,您可能希望将事务隔离级别设置为“读取未提交”,该级别在执行前不会等待释放锁。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;然后,只需通过id DESC和极限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)"发布于 2013-05-25 19:18:47
我会考虑使用真正的mysql来解决这个问题,我认为使用ram-数据库是一个更好的选择。至少要用一个记忆引擎。
您可以创建一个后插入触发器,它对条目进行计数,并删除最古老的太多条目。或者创建一个cronjob来删除最古老的“太多”条目。
另见:https://stackoverflow.com/a/10017798/2277620
无论如何,select应该只使用limit 10读取最后10个条目,就像在另一个答案中一样。
发布于 2013-05-25 19:34:47
我很想接受上述任何一项建议。
或者,如果超过10条,则可以使用insert上的触发器删除记录。
或者,如果您对没有cron作业访问权限的计划清理作业感到满意,那么您可以在MySQL中使用预定的事件。
https://stackoverflow.com/questions/16752981
复制相似问题