查询优化以查找最新条目

时间:2018-07-11 14:19:14

标签: mysql sql join group-by

我有一个货币汇率数据库,想通过定义当前时间的时间戳来仅选择最新汇率。 (请为每个速率选择最新的速率,而不是全部,因为它们可能具有不同的时间戳)

以下查询可以满足我的要求,但是速度非常慢(> 3秒)

SELECT  cR.currencyCode, cR.rate, cR.timestamp FROM currentRates cR
JOIN ( SELECT MAX(timestamp) as max, currencyCode 
       FROM currentRates 
       GROUP BY currencyCode) cR_mt 
ON (cR.timestamp = cR_mt.max AND cR.currencyCode = cR_mt.currencyCode);

表架构如下:

CREATE TABLE `currentRates` (
  `ID` int(11) NOT NULL,
  `rate` float DEFAULT NULL,
  `currencyCode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

目前有约15万个条目。


请您帮助我,以帮助您缩短查询时间。我已经对rate和currencyCode进行了索引,并花了3秒的时间(之前花了大约10秒的时间)

非常感谢您的帮助!

L1am0

2 个答案:

答案 0 :(得分:3)

您要按currencyCode分组并计算最大值timestamp,因此您的索引应以此顺序为currencyCode, timestamp

CREATE INDEX IDX_currentRates_CurrencyCode_Timestamp ON currentRates (currencyCode, timestamp)

答案 1 :(得分:0)

我建议将查询编写为:

SELECT cR.currencyCode, cR.rate, cR.timestamp
FROM currentRates cR
WHERE cR.timestamp = (SELECT MAX(cr2.timestamp)
                      FROM currentRates cR2
                      WHERE cR2.currencyCode = cR.currencyCode
                     );

然后您要在currentRates(currencyCode, timestamp desc)上建立索引。