sql - 优化最大值查询

标签 sql postgresql optimization time statistics

我想就如何优化查询征求意见?我希望让它运行得更快,因为我觉得它会随着速度远离用户体验。

我的程序每小时收集一次数据,我想优化我的查询,它获取最新数据并为特定事件创建前 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

我的查询为 event_id = 1 返回了最后一小时的前 100 个查询,但我希望对其进行优化,并且我相信子查询是问题的根本原因。我尝试过其他查询,但它们最终要么重复,要么结果不是来自最新的数据集

谢谢

编辑::

表account包含[user_id, nickname]

统计表包含 [user_id, event_id, value, created_on]

最佳答案

NOW() - '1 hour'::INTERVAL 不是 MySQL 语法;也许你的意思是 NOW() - INTERVAL 1 HOUR

IN ( SELECT ... ) 优化很差。

不知道 accountsstats 之间的关系(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 为每个表
  • EXPLAIN SELECT ...; 对于任何合理的候选人

关于sql - 优化最大值查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768654/

相关文章:

php - 为什么我可以用 NULL 值初始化该列,但无法这样更新它?

php - MYSQL子查询内连接order by count

mysql - 从组合列中查找最小/最大值,忽略 0 和 NULL-MYSQL

PHP PDO Postgres 与 Sqlite 列类型的计数 (*)

python - 提速生成器->列表-> Python中的CSV

performance - 性能总是重要的吗?

sql - 在 postgresql 中,当 case 语句为 true 时添加条件

ruby-on-rails - Heroku 迁移:PG::错误:错误:关系 "roles"不存在

node.js - 如何高效地将 Postgres 数据从 Query 传输到 S3

algorithm - 用于将组理想分配到可能溢出的容器中的有效算法?