如何更改查询以使其更快?

时间:2018-07-03 06:58:31

标签: mysql sql

这是对MySQL数据库的一些查询。 (按历史记录)这是可行的,但我认为这是一个瓶颈。

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 :(得分:0)

似乎第一个子查询总是只在Symbol = inSymbol时才选择一行,因此您可以按如下所示重写它。并且确保您必须索引SymbolTimestapmMs字段

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