2

我有一个用 pusher 制作的聊天室应用程序。我想在数据库(MySQL)上存储最后 10 条消息。所以,会有频繁的写入。但是,只会存储 10 条消息,并且所有旧消息都将被删除。

例子:

  1. 消息 1 到 10 将存储在数据库中
  2. 消息 11 进来,那是消息 1 将被删除的时间

这最后 10 条消息只会在用户第一次访问并登录聊天室时检索,以便他/她能够回读聊天室中的最新消息

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

4

3 回答 3

1

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

您可以创建一个插入后触发器来计算条目并删除最旧的太多条目。或者您创建一个删除最旧的“太多”条目的 cronjob。

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

无论如何,选择应该只读取最后10个条目,limit 10如另一个答案。

于 2013-05-25T19:18:47.107 回答
0

对此,性能最好的 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 和 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)"
于 2013-05-25T19:11:24.250 回答
0

我很想选择上述任何一种。

或者,如果记录超过 10 条,您可以在插入时使用触发器来删除记录。

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

于 2013-05-25T19:34:47.310 回答