Это некоторый запрос к MySQL db. Это работы (исторически), но очень узкие места, я полагаю.
SELECT
tb_real.One,
tb_real.Two,
tb_real.TimestampMs,
tb_real.Symbol,
tb_max.MaxTimestapmMs
FROM (SELECT
Symbol,
MAX(TimestampMs) AS MaxTimestapmMs
FROM times
WHERE Symbol = inSymbol
AND TimestampMs < inDateTo) AS tb_max
JOIN (SELECT
TimestampMs,
One,
Two,
Symbol
FROM Times
WHERE Symbol = inSymbol
AND TimestampMs < inDateTo) AS tb_real
ON tb_max.MaxTimestapmMs = tb_real.TimestampMs
;
Он работает, но достаточно медленно. Можно ли сделать это проще\быстрее?
Кажется, что первый подзапрос всегда выбирает только одну строку, как только Symbol = inSymbol
поэтому вы можете просто переписать ее следующим образом. И обязательно вы должны индексировать поля Symbol
и TimestapmMs
SELECT
One,
Two,
TimestampMs,
Symbol,
TimestapmMs
FROM Times
WHERE Symbol = inSymbol
AND TimestampMs = (SELECT
MAX(TimestampMs)
FROM times
WHERE Symbol = inSymbol
AND TimestampMs < inDateTo)
Также, если поле TimestampMs
уникально (только одна запись имеет значение MAX), и этот запрос всегда возвращает только одну запись, вы можете использовать LIMIT 1
для получения этой записи:
SELECT
One,
Two,
TimestampMs,
Symbol,
TimestapmMs
FROM Times
WHERE Symbol = inSymbol
AND TimestampMs < inDateTo
ORDER BY TimestampMs DESC
LIMIT 1
sp_get_times
(IN inDateTo bigint) BEGIN SET sql_big_selects = 1; ВЫБРАТЬ tb_real.One, tb_real.Two, tb_real.TimestampMs, tb_real.Symbol, tb_max.MaxTimestapmMs FROM (ВЫБРАТЬ символ, МАКС. Один, два, символ ОТ времен, ГДЕ отметка времениMs <inDateTo) КАК tb_real ON tb_max.MaxTimestapmMs = tb_real.TimestampMs;