我正在使用 MySQL 数据库。我必须连接两个表(A,B)。他们有关系(N->N)。其实A是聊天室表,B是聊天记录(聊天记录)。
聊天室有很多聊天内容。如果用户进入聊天应用程序,聊天室列表应按最新收到的聊天进行排序。
但此时聊天室聊天量过多,加入性能严重下降。所以,我的想法是:
聊天表按照创建时间排序。所以,这是一种时间序列数据。
聊天室反向查找聊天表,因此可以找到最新创建的聊天。
当某个聊天室找到第一个聊天时,它会停止搜索加入。
我的问题是:
还有其他方法可以反向查找列吗?
有没有其他方法可以在两个表连接时在某个列匹配(找到)时停止?
聊天
CREATE TABLE `chat` (
`chat_room_id` bigint DEFAULT NULL,
`created_at` datetime(6) DEFAULT NULL,
`id` bigint NOT NULL AUTO_INCREMENT,
`member_id` bigint DEFAULT NULL,
`subject_id` bigint DEFAULT NULL,
`content` varchar(255) NOT NULL,
`message_type` enum('POST','IMAGE','TEXT') DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK44b6elhh512d2722l09i6qdku` (`chat_room_id`),
KEY `FKgvc5hrt0h18xk63qosss3ti30` (`member_id`),
CONSTRAINT `FK44b6elhh512d2722l09i6qdku` FOREIGN KEY (`chat_room_id`) REFERENCES `chat_room` (`id`),
CONSTRAINT `FKgvc5hrt0h18xk63qosss3ti30` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`)
)
聊天室
CREATE TABLE `chat_room` (
`member_cnt` int DEFAULT NULL,
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`room_type` enum('GROUP','PERSONAL') DEFAULT NULL,
PRIMARY KEY (`id`)
)
谢谢你。
你可以做类似的事情
select chat_room.*
from chat
join chat_room
on chat.chat_room_id = chat_room.id
left join chat newer_chat
on newest_chat.chat_room_id = chat_room.id and newer_chat.created_at > chat.created_at
where newer_chat.id is null
order by chat.created_at desc
这会加入带有个人聊天的聊天室,前提是没有比我们加入的聊天更新的聊天。现在,如果这还不够快,那么您可能需要确保在 (chat_room_id,created_at) 上有
chat
表的索引,这将大大提高搜索速度。或者,您可以有一个 last_chat_in_room
表,每当您插入新聊天时,该表中的相应记录都会正确插入,因此它将是最新的并使用此聚合表而不是聊天表。或者,您可以使用 cron 作业根据最新聊天对房间进行排名,并缓存结果并从该缓存中读取。