Mysql 长响应时间
我有一个有效的MySQL查询,它从数据库中输入的每个社区中选择表的最新占用率,但它似乎在扫描整个数据库中的条目,因为查找时间大约需要3-4秒 根据下面查询中提供的详细信息,有人能为我提供一种更快/更好的方法来查找每个社区的最新时间戳字段吗?-我需要查询来选择输入的每个社区,并带有最新的时间戳,但所选社区的限制应为1(这意味着名为“Test community”的社区可能有数百个提交,但我需要选择最新输入的时间戳,以及表中输入的每个社区的相同选择)Mysql 长响应时间,mysql,sql,mysql-select-db,Mysql,Sql,Mysql Select Db,我有一个有效的MySQL查询,它从数据库中输入的每个社区中选择表的最新占用率,但它似乎在扫描整个数据库中的条目,因为查找时间大约需要3-4秒 根据下面查询中提供的详细信息,有人能为我提供一种更快/更好的方法来查找每个社区的最新时间戳字段吗?-我需要查询来选择输入的每个社区,并带有最新的时间戳,但所选社区的限制应为1(这意味着名为“Test community”的社区可能有数百个提交,但我需要选择最新输入的时间戳,以及表中输入的每个社区的相同选择) 根据我的经验,相关子查询的性能通常很差;请尝试以
根据我的经验,相关子查询的性能通常很差;请尝试以下方法:
SELECT t1.reportID, t1.communityID, t1.region, t1.percentOccupied
, t1.TIMESTAMP, Communities.fullName
FROM NightlyReports AS t1
INNER JOIN Communities ON t1.communityID = Communities.communityID
INNER JOIN (
SELECT communityID, MAX( TIMESTAMP ) AS lastTimestamp
FROM NightlyReports
WHERE region = 'GA'
GROUP BY communityID
) AS lastReports ON t1.communityID = lastReports.communityID
AND t1.TIMESTAMP = lastReports.lastTimestamp
WHERE t1.region = 'GA'
ORDER BY percentOccupied DESC
根据我的经验,相关子查询的性能通常很差;请尝试以下方法:
SELECT t1.reportID, t1.communityID, t1.region, t1.percentOccupied
, t1.TIMESTAMP, Communities.fullName
FROM NightlyReports AS t1
INNER JOIN Communities ON t1.communityID = Communities.communityID
INNER JOIN (
SELECT communityID, MAX( TIMESTAMP ) AS lastTimestamp
FROM NightlyReports
WHERE region = 'GA'
GROUP BY communityID
) AS lastReports ON t1.communityID = lastReports.communityID
AND t1.TIMESTAMP = lastReports.lastTimestamp
WHERE t1.region = 'GA'
ORDER BY percentOccupied DESC
你的问题很好。对于此查询(只重写了一点): 您希望索引位于:
NightlyReports(地区、时间戳、社区ID)
NightlyReports(社区ID、时间戳)
(可能已经存在)社区(社区ID)
相关子查询本身不是问题。您的查询很好。对于此查询(只重写了一点): 您希望索引位于:
NightlyReports(地区、时间戳、社区ID)
NightlyReports(社区ID、时间戳)
(可能已经存在)社区(社区ID)
相关子查询本身不是问题。太棒了,这个查询正是我想要的,这就是我如此喜欢的原因……谢谢!你能描述一下双内连接吗?我一点也没有弄乱过查询,但这不是我以前使用过的,您可以根据需要(当然在正常范围内)连接任意多的表(或子查询),只要每个表都有一个唯一的标识符/别名。多个连接没有什么特别的,就像a+b+c实际上并不比a+b更特别。啊,好吧,这很有意义,我以后会记得的,再次感谢!太棒了,这个问题正是我想要的,这就是为什么我如此爱你…谢谢!你能描述一下双内连接吗?我一点也没有弄乱过查询,但这不是我以前使用过的,您可以根据需要(当然在正常范围内)连接任意多的表(或子查询),只要每个表都有一个唯一的标识符/别名。多个连接没有什么特别的,就像a+b+c实际上并不比a+b更特别。啊,好吧,这很有意义,我以后会记得的,再次感谢!隐马尔可夫模型。。。回顾这个问题,我很好奇。您是说您提供的备选查询(仍然包含相关子查询)与@uuerdo的答案一样快吗?我将对此进行测试,但我很好奇,因为您提到子查询可以以不同的方式使用,因为它“本身不是问题”。@ViaTech。可以更快,特别是在给定索引的情况下。我提供这个答案是因为它更接近你最初的查询。嗯。。。回顾这个问题,我很好奇。您是说您提供的备选查询(仍然包含相关子查询)与@uuerdo的答案一样快吗?我将对此进行测试,但我很好奇,因为您提到子查询可以以不同的方式使用,因为它“本身不是问题”。@ViaTech。可以更快,特别是在给定索引的情况下。我提供了这个答案,因为它更接近您最初的查询。
SELECT nr.reportID, nr.communityID, nr.region, nr.percentOccupied,
nr.TIMESTAMP, c.fullName
FROM NightlyReports nr INNER JOIN
Communities c
ON nr.communityID = c.communityID
WHERE nr.TIMESTAMP = (SELECT MAX(nr2.TIMESTAMP)
FROM NightlyReports nr2
WHERE nr.communityID = nr2.communityID
) AND
nr.region = 'GA'
ORDER BY percentOccupied DESC;