我有一张像这样的MySQL桌子:
day int(11)
hour int(11)
amount int(11)
日是一个整数,其值从0到365,假设小时是时间戳,而数量只是一个简单的整数。我想要做的是为某一组天数(例如,从0到10)选择value字段的值,但我只需要当天可用金额的最后一个值,它实际上是hour字段的最大值(在当天内)。这听起来并不难,但我想出的解决方案是完全没有效率的。
下面是:
SELECT q.day, q.amount
FROM amt_table q
WHERE q.day >= 0 AND q.day <= 4 AND q.hour = (
SELECT MAX(p.hour) FROM amt_table p WHERE p.day = q.day
) GROUP BY day
在11k行表上执行该查询需要5秒,而且只需5天;我可能需要选择整个月或一年的时间跨度,因此这不是一个有效的解决方案。
任何能帮我找到另一种解决方案或优化这个解决方案的人都是非常感谢的。
编辑
没有设置索引,但是(日、小时、量)可能是主键(如果需要的话)
发布于 2011-01-20 15:30:20
使用:
SELECT a.day,
a.amount
FROM AMT_TABLE a
JOIN (SELECT t.day,
MAX(t.hour) AS max_hour
FROM AMT_TABLE t
GROUP BY t.day) b ON b.day = a.day
AND b.max_hour = a.hour
WHERE a.day BETWEEN 0 AND 4
我认为您使用GROUP BY a.day
只是为了每天获得一个金额值,但这并不可靠,因为在MySQL中,组中的列不是任意的--值可能会改变。遗憾的是,MySQL还不支持分析(ROW_NUMBER等),这是您通常用于这种情况的方法。
首先查看主键上的索引,然后在用于将表连接在一起的列上添加索引。复合索引(从多个列到一个索引)也是一个选项。
发布于 2011-01-20 15:31:26
我认为问题在于where子句中的子查询。MySQl将首先计算整个表的“从amt_table p中选择最大(p.hour),p.day = q.day”,然后选择天数。效率不高:-)
https://stackoverflow.com/questions/4753833
复制相似问题