优化最新时间戳查询mysql

iyfamqjs  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(529)

为了仅获取具有最新时间戳的数据,我使用以下答案中的mysql查询:
获取列的最大值所在的行
我的问题如下:

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)
isr3a4wc

isr3a4wc1#

您使用的是所谓的依赖子查询。这些有时效率很低,因为查询规划器会对外部查询中的每个值重复它们( m1.stock_id 在你的情况下)。
您可以使用此子查询来检索每个股票id值的最大时间戳。

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

您的复合主键应该使这一点非常快,因为mysql将做一个“松散索引扫描”来满足它。
然后可以将其用作子查询,如下所示:

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/

qltillow

qltillow2#

您使用的是所谓的依赖子查询。有时效率很低。
您可以使用此子查询来检索每个股票id值的最大时间戳。

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

您的复合主键应该使这一点非常快,因为mysql将做一个“松散索引扫描”来满足它。
然后可以将其用作子查询,如下所示:

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

这也应该利用您的主键。

相关问题