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