2017-03-18 187 views
1

我需要優化此查詢:優化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擴展輸出:

+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+ 
| 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),但我真的不知道如何根據JOIN-以優化查詢編輯表。

我該如何加快速度?

回答

2

此查詢的最佳索引:

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)

+0

如何(id_currency,id_currency_source,buy_rate)?實際上最好的選擇不是取決於每個id_currency,id_currency_source組合的平均有多少個不同的日期和費率? – Frazz

+0

@GordonLinoff'currency_rate(id_currency,id_currency_source,rate_date,buy_rate)'在我的情況下是最好的,它加速了我的查詢從〜0.5 s到〜0,075 s,當其他索引(包括@Frazz提到的一個)縮短執行時間到0,145秒。 –

+1

好。請記住,如果數據庫總體發生顯着變化,您可能需要重新測試。我的意思是......尤其是如果你正在使用一個測試數據庫,請注意生產數據庫中的東西可能會有所不同。 – Frazz