gpt4 book ai didi

mysql - 使用 IN 和 GROUP BY 运行 MySQL 查询非常慢

转载 作者:行者123 更新时间:2023-11-29 03:07:05 24 4
gpt4 key购买 nike

我正在尝试构建一个页面,其中显示了成员已收到的消息列表。我想出了这个 mySQL 查询,但它运行起来非常慢。执行它至少需要 10 秒。

SELECT senderid,
receiverid
FROM messages
WHERE ( receiverid, sentdate ) IN (SELECT receiverid,
Max(sentdate)
FROM messages
WHERE receiverid = '1'
GROUP BY senderid)
ORDER BY sentdate DESC

这是我正在使用的数据库:

`autoID` mediumint(11) unsigned NOT NULL AUTO_INCREMENT`senderID` mediumint(11) unsigned DEFAULT '0'`receiverID` mediumint(11) unsigned DEFAULT '0'`sentDate` datetime DEFAULT '0000-00-00 00:00:00'`message` longtextPRIMARY KEY (`autoID`)KEY `receiverID` (`receiverID`)KEY `senderID` (`senderID`)

数据库只有 150,000 个条目。我正在运行我自己的专用服务器,上面只有那个 mySQL 数据库。

非常感谢任何帮助。

G-Nugget,我在 sentDate 上添加了一个索引,但速度没有提高。这是 EXPLAIN(抱歉显示的方式。不知道我还能怎么做):

编号:1
选择_类型:主要
表:消息
类型:全部
possible_keys:null
键:空
key_len:null
引用:空
行数:149433
额外:在哪里使用;使用文件排序

编号:2
select_type:DEPENDENT SUBQUERY
表:消息
类型:引用
possible_keys:receiverID
key :receiverID
key_len:4
引用:常量
行数:20
额外:在哪里使用;使用临时的;使用文件排序

最佳答案

这个查询如何产生您提到的结果集?

SELECT m.senderid,
m.receiverid
FROM messages m
JOIN (
SELECT max(autoID) autoID,
receiverID, SenderID
FROM messages
GROUP BY receiverId, SenderID
) X on m.autoID = x.AutoId
WHERE m.receiverId = '1'
ORDER BY m.autoID desc

这利用了 autoID 和 senddate 很可能都随着时间的推移单调增加的假设。它提取每对不同的发送者/接收者之间的最新消息的 ID,然后使用这些 ID 选择要显示的消息表的子集。

关于mysql - 使用 IN 和 GROUP BY 运行 MySQL 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13575997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com