3 миллиона цен могут означать, что ваше приложение может извлечь выгоду из некоторой денормализации. (т. е. помечать последнюю цену каким-либо образом, помните: однократная запись, многим чтение часто стоит затрат на медленную запись).
С текущими данными стоит попробовать:
SELECT p1.id, p1.price, p1.timelog, p1.user_id
FROM prices p1
JOIN stores
ON stores.id = prices.id
AND stores.city = "miami"
LEFT JOIN prices p2
ON p2.product_id = p1.product_id
AND p2.id = p1.id
AND p2.timelog > p1.timelog
WHERE p1.product_id = 1 AND p2.id IS NULL;
... и еще один более быстрый вариант, который всегда ускользает от меня в это время ночи:)
Имейте в виду, что многое может измениться при правильных индексах для таблиц, поэтому обязательно запустите EXPLAIN
для лота.