Как изменить запрос, чтобы сделать его более быстрым? - PullRequest
0 голосов
/ 03 июля 2018

Это какой-то запрос к 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
;

Это работает, но достаточно медленно. Можно ли сделать это проще \ быстрее?

1 Ответ

0 голосов
/ 03 июля 2018

Кажется, что первый подзапрос всегда выбирает только одну строку, как только 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...