簡體   English   中英

優化最新的時間戳查詢mysql

[英]optimize latest timestamp query mysql

為了只獲取具有最新時間戳的數據,我從以下答案中使用了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)

您正在使用所謂的從屬子查詢。 這些有時可能效率很低。

您可以使用此子查詢來檢索每個stock_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

這也應該利用您的主鍵。

您正在使用所謂的從屬子查詢。 這些有時效率很低,因為查詢計划者m1.stock_id外部查詢中的每個值(在您的情況下為m1.stock_id )重復它們。

您可以使用此子查詢來檢索每個stock_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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM