оптимизировать последний запрос метки времени MySQL - PullRequest
0 голосов
/ 11 мая 2018

чтобы получить только данные с последней отметкой времени, я использую запрос mysql из этого ответа:

выборки-в-ряд-который-имеет-в-Max-значение- в-а-колонки

мой запрос следующий:

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)

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы используете так называемый зависимый подзапрос. Иногда это может быть очень неэффективно.

Вы можете использовать этот подзапрос для получения максимальной отметки времени для каждого значения 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

Это тоже должно использовать ваш первичный ключ.

0 голосов
/ 11 мая 2018

Вы используете так называемый зависимый подзапрос. Они иногда могут быть очень неэффективными, поскольку планировщик запросов повторяет их для каждого значения из внешнего запроса (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 /

...