【问题标题】:optimize latest timestamp query mysql优化最新时间戳查询mysql
【发布时间】:2018-10-22 05:10:54
【问题描述】:

要仅获取具有最新时间戳的数据,我使用此答案中的 mysql 查询:

fetch-the-row-which-has-the-max-value- for-a-column

我的查询如下:

SELECT stock_id,timestamp,price FROM market m1
                        WHERE timestamp = 
                            (SELECT MAX(timestamp) FROM market m2 WHERE m1.stock_id = m2.stock_id)

但执行需要 10 分钟。

优化它的不同选项是什么? (mysql)

市场有以下架构:(sqlalchemy)

class Market(db.Model):
    stock_id=db.Column(db.Integer,db.ForeignKey('stock.id'),primary_key=True)
    timestamp=db.Column(db.Integer,primary_key=True)
    price=db.Column(db.Float)

【问题讨论】:

标签: mysql sqlalchemy query-optimization greatest-n-per-group database-optimization


【解决方案1】:

您正在使用所谓的依赖子查询。这些有时效率非常低。

您可以使用此子查询来检索每个 stock_id 值的最大时间戳。

                   SELECT MAX(timestamp) timestamp, stock_id
                     FROM market
                    GROUP BY stock_id

你的复合主键应该会很快,因为 MySQL 会满足 a "loose index scan" to 的要求。

那么你可以把它当做子查询,如下:

  SELECT m.stock_id, m.timestamp, m.price
    FROM market m
    JOIN (
                   SELECT MAX(timestamp) timestamp, stock_id
                     FROM market
                    GROUP BY stock_id
         ) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp

这也应该利用您的主键。

【讨论】:

    【解决方案2】:

    您正在使用所谓的依赖子查询。这些有时可能非常低效,因为查询规划器会为外部查询中的每个值重复它们(在您的情况下为m1.stock_id)。

    您可以使用此子查询来检索每个 stock_id 值的最大时间戳。

                       SELECT MAX(timestamp) timestamp, stock_id
                         FROM market
                        GROUP BY stock_id
    

    你的复合主键应该会很快,因为 MySQL 会做 a "loose index scan" 来满足它。

    那么就可以将其作为子查询使用,如下:

      SELECT m.stock_id, m.timestamp, m.price
        FROM market m
        JOIN (
                       SELECT MAX(timestamp) timestamp, stock_id
                         FROM market
                        GROUP BY stock_id
             ) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp
    

    这也应该利用您的主键。 https://use-the-index-luke.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多