1

我正在为回合制游戏(使用 PHP 和 MySQL)构建聊天,我只想将 30 条最新消息保存在 MySQL 数据库中。

目前,当计数超过 30 时,我正在执行 3 个查询以删除最旧的消息:

  1. 将新的聊天消息作为新行插入:

    插入聊天消息(userId,matchId,message,timestamp)值(“.$params[“userId”].”,”.$params[“matchId”]。“,'”。$params[“message”]。” ',现在())

  2. 检查数据库中是否有太多消息,并获取最旧的 Id。

    SELECT COUNT(id) AS count, id AS oldId FROM chatMessages WHERE matchId = ".$params["matchId"]." ORDER BY id ASC 限制 1

  3. 删除最旧的消息

    DELETE FROM chatMessages WHERE id = ".$oldestId

有什么方法可以在 2 个甚至 1 个单个查询中执行此操作吗?我们的服务器上有很多流量,所以性能是关键。

4

1 回答 1

0

您可以将第二个和第三个查询减少到一个:

delete from chatMessages 
where id not in (select id from chatMessages 
                 order by id desc 
                 limit 30)

你可以把它放在一个插入触发器中。这样最旧的记录将在插入后自动删除。

于 2012-06-03T12:25:40.257 回答