优化最大值查询
Optimizing Max Value query
我想就如何优化查询征求意见?我希望让它 运行 更快,因为我觉得它会随着速度从用户体验中消失。
我的程序每小时收集一次数据,我想优化我的查询,它获取最新数据并为特定事件创建前 100 人,
SELECT a.user_id as user, nickname, value, s.created_on
FROM stats s,accounts a
WHERE a.user_id = s.user_id AND event_id = 1 AND s.created_on in
(SELECT created_on FROM stats WHERE created_on >= NOW() - '1 hour'::INTERVAL)
ORDER BY value desc
LIMIT 100
我的查询 returns 最近一小时的前 100 个 event_id = 1,但我希望对其进行优化,我相信子查询是问题的根本原因。我尝试了其他查询,但结果要么是重复的,要么结果不是来自最新的数据集
谢谢
编辑::
table 帐户包含 [user_id, 昵称]
统计数据 table 包含 [user_id、event_id、值、created_on]
NOW() - '1 hour'::INTERVAL
不是 MySQL 语法;也许你的意思是 NOW() - INTERVAL 1 HOUR
?
IN ( SELECT ... )
优化很差。
不知道 accounts
和 stats
之间的关系(1:1、1:many 等),我只能猜测什么可能有效:
SELECT a.user_id as user, nickname, value, s.created_on
FROM stats s,accounts a
WHERE a.user_id = s.user_id
AND event_id = 1
AND s.created_on >= NOW() - INTERVAL 1 HOUR)
ORDER BY value desc
LIMIT 100
INDEX(event_id, value) -- if they are both in `a`
INDEX(user_id, created_on)
或...
SELECT user_id as user, nickname, value,
( SELECT MAX(created_on) FROM stats
WHERE user_id = a.user_id ) AS created_on
FROM accounts
AND event_id = 1
AND EXISTS
( SELECT *
FROM stats
WHERE created_on >= NOW() - INTERVAL 1 HOUR
AND user_id = a.user_id
)
ORDER BY value desc
LIMIT 100
INDEX(user_id, created_on)
INDEX(event_id, value)
请提供
SHOW CREATE TABLE
每个 table
EXPLAIN SELECT ...;
对于任何合理的候选人
我想就如何优化查询征求意见?我希望让它 运行 更快,因为我觉得它会随着速度从用户体验中消失。
我的程序每小时收集一次数据,我想优化我的查询,它获取最新数据并为特定事件创建前 100 人,
SELECT a.user_id as user, nickname, value, s.created_on
FROM stats s,accounts a
WHERE a.user_id = s.user_id AND event_id = 1 AND s.created_on in
(SELECT created_on FROM stats WHERE created_on >= NOW() - '1 hour'::INTERVAL)
ORDER BY value desc
LIMIT 100
我的查询 returns 最近一小时的前 100 个 event_id = 1,但我希望对其进行优化,我相信子查询是问题的根本原因。我尝试了其他查询,但结果要么是重复的,要么结果不是来自最新的数据集
谢谢
编辑::
table 帐户包含 [user_id, 昵称]
统计数据 table 包含 [user_id、event_id、值、created_on]
NOW() - '1 hour'::INTERVAL
不是 MySQL 语法;也许你的意思是 NOW() - INTERVAL 1 HOUR
?
IN ( SELECT ... )
优化很差。
不知道 accounts
和 stats
之间的关系(1:1、1:many 等),我只能猜测什么可能有效:
SELECT a.user_id as user, nickname, value, s.created_on
FROM stats s,accounts a
WHERE a.user_id = s.user_id
AND event_id = 1
AND s.created_on >= NOW() - INTERVAL 1 HOUR)
ORDER BY value desc
LIMIT 100
INDEX(event_id, value) -- if they are both in `a`
INDEX(user_id, created_on)
或...
SELECT user_id as user, nickname, value,
( SELECT MAX(created_on) FROM stats
WHERE user_id = a.user_id ) AS created_on
FROM accounts
AND event_id = 1
AND EXISTS
( SELECT *
FROM stats
WHERE created_on >= NOW() - INTERVAL 1 HOUR
AND user_id = a.user_id
)
ORDER BY value desc
LIMIT 100
INDEX(user_id, created_on)
INDEX(event_id, value)
请提供
SHOW CREATE TABLE
每个 tableEXPLAIN SELECT ...;
对于任何合理的候选人