我有一个像这样的MySQL表:
day int(11)
hour int(11)
amount int(11)
Day是一个整数,其值从0到365,假设小时是时间戳,金额只是一个简单的整数。我想要做的是选择某一天的金额字段的值(例如从0到10),但我只需要当天可用金额的最后一个值,实际上是小时字段的最大值(当天内)。这听起来并不太难,但我提出的解决方案完全没有效率。
这是:
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天的时间;我可能需要选择整个月或一年的跨度,因此这不是一个有效的解决方案。
任何能够帮助我找到另一种解决方案或优化此解决方案的人都非常感激
修改
未设置索引,但(日,小时,金额)可以是主要密钥(如果需要)
答案 0 :(得分:4)
使用:
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中,不在GROUP BY中的列是任意的 - 值可能会改变。可悲的是,MySQL还不支持分析(ROW_NUMBER等),这是你通常用于这类案件的。
首先查看主键上的索引,然后在用于将表连接在一起的列上添加索引。复合索引(索引的多个列)也是一个选项。
答案 1 :(得分:0)
我认为问题是where子句中的子查询。 MySQl将首先计算整个表格中的“SELECT MAX(p.hour)FROM amt_table p WHERE p.day = q.day”,然后选择日期。效率不高: - )