当找到第一个匹配列时,还有其他方法可以停止连接吗?

问题描述 投票:0回答:1

我正在使用 MySQL 数据库。我必须连接两个表(A,B)。他们有关系(N->N)。其实A是聊天室表,B是聊天记录(聊天记录)。

聊天室有很多聊天内容。如果用户进入聊天应用程序,聊天室列表应按最新收到的聊天进行排序。

但此时聊天室聊天量过多,加入性能严重下降。所以,我的想法是:

  1. 聊天表按照创建时间排序。所以,这是一种时间序列数据。

  2. 聊天室反向查找聊天表,因此可以找到最新创建的聊天。

  3. 当某个聊天室找到第一个聊天时,它会停止搜索加入。

我的问题是:

  1. 还有其他方法可以反向查找列吗?

  2. 有没有其他方法可以在两个表连接时在某个列匹配(找到)时停止?

聊天

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`)
)

谢谢你。

mysql database join optimization chat
1个回答
0
投票

你可以做类似的事情

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 作业根据最新聊天对房间进行排名,并缓存结果并从该缓存中读取。

© www.soinside.com 2019 - 2024. All rights reserved.