通过查询优化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货币、来源组合的平均日期和利率有多少不同吗?@GordonLinoffcurrency\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列“覆盖”——也就是说,所有需要的列都在索引中,因此无需访问数据。