简体   繁体   中英

Optimizing MySQL GROUP BY query

I need to optimize this query:

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

Now it takes about 0,5 s, which is way too long for me (it's used either updated very often, so query cache doesn't help in my case).

Here's EXPLAIN EXTENDED output:

+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+
| 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 |
+------+-------------+-------+-------+--------------------------------+-------------+---------+-------------------------+-------+----------+-------------+

There are some great questions at stackoverflow for one table GROUP BY optimization (like: https://stackoverflow.com/a/11631480/1320081 ), but I really don't know how to optimize query based on JOIN-ed tables.

How can I speed it up?

The best index for this query:

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;

is: currency_rate(id_currency, id_currency_source, rate_date, buy_rate) . You might also try currency_purchase(id_currency, id_currency_source, rate_date) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM