优化最新时间戳查询mysql

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

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

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

但执行起来需要10分钟。
优化它有哪些不同的选择(mysql数据库)
市场有以下模式:(sqlalchemy)

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

isr3a4wc1#

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

  1. SELECT MAX(timestamp) timestamp, stock_id
  2. FROM market
  3. GROUP BY stock_id

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

  1. SELECT m.stock_id, m.timestamp, m.price
  2. FROM market m
  3. JOIN (
  4. SELECT MAX(timestamp) timestamp, stock_id
  5. FROM market
  6. GROUP BY stock_id
  7. ) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp

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

展开查看全部
qltillow

qltillow2#

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

  1. SELECT MAX(timestamp) timestamp, stock_id
  2. FROM market
  3. GROUP BY stock_id

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

  1. SELECT m.stock_id, m.timestamp, m.price
  2. FROM market m
  3. JOIN (
  4. SELECT MAX(timestamp) timestamp, stock_id
  5. FROM market
  6. GROUP BY stock_id
  7. ) maxt on m.stock_id = maxt.stock_id AND m.timestamp = maxt.timestamp

这也应该利用您的主键。

展开查看全部

相关问题