Как изменить запрос, чтобы сделать его более быстрым?

0

Это некоторый запрос к 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
Лучший ответ

Кажется, что первый подзапрос всегда выбирает только одну строку, как только 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 
  • 0
    хорошо, и если: CREATE PROCEDURE 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню