我正在为一个回合制游戏(使用 PHP 和 MySQL)构建一个聊天,我只想将 30 条最新消息保存在 MySQL 数据库中。
目前,我正在执行 3 次查询以在计数超过 30 时删除最旧的消息:
- 将
新的聊天消息作为新行插入:
插入聊天消息(用户ID,匹配ID,消息,时间戳) 值(".$params["用户ID"].",".$params["匹配ID"].",'".
$params["消息"]."',NOW())
检查数据库中的消息是否太多,并获取最旧的 ID。
从聊天消息中选择 COUNT(id) 作为计数,ID 作为最旧的 ID 其中 matchId = ".$params["matchId"]。" 按 ID 排序 ASC 限制 1
删除最早的邮件
从聊天消息中删除,其中 id = ".$oldestId
有没有办法在 2 个甚至 1 个单个查询中做到这一点?我们的服务器上有相当多的流量,所以性能是关键。
第 2 个和第 3 个查询减少到一个:
delete from chatMessages
where id not in (select id from chatMessages
order by id desc
limit 30)
您可以将其放在插入触发器中。这样,最旧的记录将在插入后自动删除。