用于查找最新条目的查询优化

vohkndzv  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(360)

我有一个货币汇率数据库,只想通过定义最近的时间戳来选择最近的汇率(为每个速率选择最近的一个,而不是全部,因为它们可能有不同的时间戳)
下面的查询符合我的要求,但速度非常慢(>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型

kmbjn2e3

kmbjn2e31#

我建议将问题写为:

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) .

798qvoo8

798qvoo82#

您正在按分组 currencyCode 计算最大值 timestamp ,所以你的索引应该是 currencyCode, timestamp 按这个顺序。

CREATE INDEX IDX_currentRates_CurrencyCode_Timestamp ON currentRates (currencyCode, timestamp)

相关问题