gpt4 book ai didi

mysql - 需要帮助优化 MySQL SELECT 查询

转载 作者:行者123 更新时间:2023-11-29 04:57:56 25 4
gpt4 key购买 nike

我有一个像这样的 MySQL 表:

day     int(11) 
hour int(11)
amount int(11)

Day 是一个整数,其值介于 0 到 365 之间,假设 hour 是一个时间戳,而 amount 只是一个简单的整数。我想要做的是为特定的一组天数(例如从 0 到 10)选择 amount 字段的值,但我只需要当天可用的最后一个 amount 值,实际上是 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 天的时间;我可能需要选择整个月或年的跨度,因此这不是有效的解决方案。

非常感谢任何可以帮助我找到其他解决方案或优化此解决方案的人

编辑

没有设置索引,但是(天,小时,金额)如果需要可以是主键

最佳答案

使用:

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 等),这是您通常用于此类情况的分析。

首先查看主键上的索引,然后在用于将表连接在一起的列上添加索引。复合索引(一个索引的多个列)也是一种选择。

关于mysql - 需要帮助优化 MySQL SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753833/

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