【问题标题】:Optimizing MySQL GROUP BY query优化 MySQL GROUP BY 查询
【发布时间】:2017-03-18 17:38:35
【问题描述】:

我需要优化这个查询:

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

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

如何加快速度?

【问题讨论】:

    标签: mysql sql optimization group-by


    【解决方案1】:

    此查询的最佳索引:

    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)

    【讨论】:

    • 怎么样(id_currency,id_currency_source,buy_rate)?最佳选择实际上不是取决于每个 id_currency、id_currency_source 组合平均有多少不同的日期和汇率吗?
    • @GordonLinoff currency_rate(id_currency, id_currency_source, rate_date, buy_rate) 在我的情况下是最好的,当其他索引(包括@Frazz 提到的索引)缩短执行时,它将我的查询从 ~0,5 s 加速到 ~0,075 s时间到 0,145 秒。
    • 好。请记住,如果数据库数量发生显着变化,您可能需要重新测试。我的意思是...特别是如果您当前使用的是测试数据库,请注意生产数据库上的情况可能会有所不同。
    • @Frazz,当然,我知道。这个数据库在生产上工作了半年,在测试环境查询时间更差。
    • Gordon 的 4-col 索引优于 Frazz 的 3-col 的原因是 4 是“覆盖”——也就是说,所有所需的列都在索引中,因此无需触及数据。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2012-06-12
    • 2012-12-31
    相关资源
    最近更新 更多