我有一个货币汇率数据库,想通过定义当前时间的时间戳来仅选择最新汇率。 (请为每个速率选择最新的速率,而不是全部,因为它们可能具有不同的时间戳)
以下查询可以满足我的要求,但是速度非常慢(> 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
答案 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)
上建立索引。