我有一个货币汇率数据库,只想通过定义最近的时间戳来选择最近的汇率(为每个速率选择最近的一个,而不是全部,因为它们可能有不同的时间戳)
下面的查询符合我的要求,但速度非常慢(>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万个条目。
你能帮我把你的知识提高到查询时间吗。我已经做了一个关于汇率和货币代码的索引,并降到了3秒(在它花了~10秒之前)
非常感谢你的帮助!
l1am0型
2条答案
按热度按时间kmbjn2e31#
我建议将问题写为:
然后你需要一个索引
currentRates(currencyCode, timestamp desc)
.798qvoo82#
您正在按分组
currencyCode
计算最大值timestamp
,所以你的索引应该是currencyCode, timestamp
按这个顺序。