通过查询优化MySQL组

通过查询优化MySQL组,mysql,sql,optimization,group-by,Mysql,Sql,Optimization,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

我需要优化此查询:

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
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秒,这对我来说太长了(它被频繁使用或更新,所以查询缓存在我的情况下没有帮助)

下面是对扩展输出的解释:

+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+
| 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 |
+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+
在stackoverflow中,通过优化一个表组(如:)有一些很好的问题,但我真的不知道如何优化基于联接表的查询


如何加快查询速度?

此查询的最佳索引:

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
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\u rate(id\u currency,id\u currency\u source,rate\u date,buy\u rate)
。您也可以尝试
currency\u purchase(id\u currency,id\u currency\u source,rate\u date)

怎么样(id\u currency,id\u currency\u source,buy\u rate)?最好的选择实际上不是取决于每个id\u货币、id\u货币、来源组合的平均日期和利率有多少不同吗?@GordonLinoff
currency\u rate(id\u currency、id\u currency\u source、rate\u date、buy\u rate)
在我的情况下是最好的,当其他索引(包括@Frazz提到的一个)将执行时间缩短到0145秒。很好。请记住,如果数据库数量发生重大变化,您可能需要重新测试。我的意思是……特别是如果您当前正在使用测试数据库,请注意生产数据库上的情况可能会有所不同。@Frazz,当然,我知道。此数据库在生产数据库上工作半年,在tes上t环境查询时间更糟糕。Gordon的4列索引比Frazz的3列索引好的原因是4列“覆盖”——也就是说,所有需要的列都在索引中,因此无需访问数据。