优化 MySQL GROUP BY 查询

丹尼尔·加达夫斯基

我需要优化这个查询:

SELECT 
    cp.id_currency_purchase,
    MIN(cr.buy_rate),
    MAX(cr.buy_rate)
FROM currency_purchase cp
JOIN currency_rate cr ON cr.id_currency = cp.id_currency AND cr.id_currency_source = cp.id_currency_source
WHERE cr.rate_date >= cp.purchase_date
GROUP BY cp.id_currency_purchase

现在大约需要 0.5 秒,这对我来说太长了(它经常更新,所以查询缓存对我来说没有帮助)。

这是 EXPLAIN EXTENDED 输出:

+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+
| id   | select_type | table | type  | possible_keys                  | key         | key_len | ref                     | rows  | filtered | Extra       |
+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+
|    1 | SIMPLE      | cp    | index | id_currency_source,id_currency | PRIMARY     | 8       | NULL                    |     9 |   100.00 |             |
|    1 | SIMPLE      | cr    | ref   | id_currency,id_currency_source | id_currency | 8       | lokatnik.cp.id_currency | 21433 |   100.00 | Using where |
+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+

对于一个表 GROUP BY 优化(如:https : //stackoverflow.com/a/11631480/1320081),stackoverflow 有一些很好的问题,但我真的不知道如何基于 JOIN 表优化查询。

我怎样才能加快速度?

戈登·利诺夫

此查询的最佳索引:

SELECT cp.id_currency_purchase, MIN(cr.buy_rate), MAX(cr.buy_rate)
FROM currency_purchase cp JOIN
     currency_rate cr
     ON cr.id_currency = cp.id_currency AND
        cr.id_currency_source = cp.id_currency_source
WHERE cr.rate_date >= cp.purchase_date
GROUP BY cp.id_currency_purchase;

是:currency_rate(id_currency, id_currency_source, rate_date, buy_rate)你也可以试试currency_purchase(id_currency, id_currency_source, rate_date)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章