Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql-按添加订单时查询速度较慢_Mysql_Groupwise Maximum - Fatal编程技术网

MySql-按添加订单时查询速度较慢

MySql-按添加订单时查询速度较慢,mysql,groupwise-maximum,Mysql,Groupwise Maximum,我有一个应用程序,它可以读取电子邮件,我可以从MySql数据库的应用程序数据库中的gmail收件箱下载电子邮件。数据库具有以下结构 表1联系人: ContactID (int) ContactName (varchar(100) ContactEmailAddress (varchar(150)) 表2主题: SubjectID (int) ContactID (int) Subject (varchar(200)) 表3信息: MessageID (int) Subj

我有一个应用程序,它可以读取电子邮件,我可以从MySql数据库的应用程序数据库中的gmail收件箱下载电子邮件。数据库具有以下结构

表1联系人:

ContactID (int)
ContactName (varchar(100)
ContactEmailAddress (varchar(150))
    
表2主题:

SubjectID (int)
ContactID (int)
Subject (varchar(200))

    
表3信息:

MessageID (int)
SubjectID (int)
MessageText (varchar(150)
IsRead (tinyint)
IsReceived (tinyint)
MessageDate (DateTime)
下面是我获取最近40条记录的查询

SELECT * FROM(SELECT ROW_NUMBER()OVER(Order by isRead ASC,MessageDate DESC) RecID,
c.ContactName,s.subject,s.SubjectID,d.MessageDate,d.isRead
from Contacts c                    
INNER JOIN Subjects s on s.ContactID=c.ContactID
JOIN (
select MAX(MessageID) dtl_id,SubjectID from Messages where IsReceived=1    
GROUP BY SubjectID)d_max on (d_max.subjectid=s.subjectid)
JOIN Messages d on (d.MessageID=d_max.dtl_id)
) AS RowConstrainedResult where RecID >=1 and RecID <=40  ORDER BY RecID
但是这个查询几乎需要15秒才能加载。应该做些什么来提高查询性能。作为我的所有主键列和引用的键列都被索引。Messages表中有将近500k条记录。

您提供的链接中的解释似乎没有提到您提供的SELECT,因此我不得不忽略它

此索引可能有帮助:

Messages:  (IsReceived, SubjectID, MessageID)

我添加了标签[groupwise maximum]。它链接到许多其他正在做类似事情的问题。实际上很少有人能成功地优化任务。我在这里比较了比大多数技术更快的技术:

显示具有数据类型、索引和执行计划的表架构。我已更新了数据类型,无法在此处共享表架构。所有整数字段都已编制索引。这里可以看到执行计划,请解释查询的目标。并提供解释选择。。。。并提供SHOW-CREATE-TABLE我们需要查看索引等。SHOW-index-from-tablename可以用详细的解释显示输出吗plan@RickJames查询的目标是获取最近40封未读邮件。我将尝试解释,假设联系人表中有2个电子邮件地址,email1@mydomain.com和email2@yourdomain.com. 它们在messages表中都有10条消息。现在假设email2@yourdomain.com第二封邮件的未读状态为DB,而emial1的第一封邮件的未读状态为DB,因此email1将显示在顶部。解释结果可以在Thank上查看,添加建议的索引将查询执行时间从12秒减少到5秒以下。5秒对于UI来说仍然很糟糕。查看我的链接和/或标签。是的,你是对的,但仍然优于12或13秒。我确实检查了链接,似乎我必须在我的数据库架构中做一些小的更改,以将其降低到2到3秒。