繁体   English   中英

MySQL:SUM / MAX / MIN GROUP BY查询优化

[英]MySQL: SUM/MAX/MIN GROUP BY query optimize

我有一张比特币交易表:

CREATE TABLE `transactions` (
      `trans_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `trans_exchange` int(10) unsigned DEFAULT NULL,
      `trans_currency_base` int(10) unsigned DEFAULT NULL,
      `trans_currency_counter` int(10) unsigned DEFAULT NULL,
      `trans_tid` varchar(20) DEFAULT NULL,
      `trans_type` tinyint(4) DEFAULT NULL,
      `trans_price` decimal(15,4) DEFAULT NULL,
      `trans_amount` decimal(15,8) DEFAULT NULL,
      `trans_datetime` datetime DEFAULT NULL,
      `trans_sid` bigint(20) DEFAULT NULL,
      `trans_timestamp` int(10) unsigned DEFAULT NULL,
      PRIMARY KEY (`trans_id`),
      KEY `trans_tid` (`trans_tid`),
      KEY `trans_datetime` (`trans_datetime`),
      KEY `trans_timestmp` (`trans_timestamp`),
      KEY `trans_price` (`trans_price`),
      KEY `trans_amount` (`trans_amount`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6162559 DEFAULT CHARSET=utf8;

从AUTO_INCREMENT值可以看到,该表有超过600万个条目。 最终将会有更多。

我想查询表格以获得任意时间间隔内的最高价,最低价,数量和总交易量。 为此,我使用了如下查询:

SELECT 
    DATE_FORMAT( MIN(transactions.trans_datetime),
        '%Y/%m/%d %H:%i:00'
        ) AS trans_datetime,
    SUM(transactions.trans_amount) as trans_volume,
    MAX(transactions.trans_price) as trans_max_price,
    MIN(transactions.trans_price) as trans_min_price,
    COUNT(transactions.trans_id) AS trans_count 
    FROM 
    transactions
    WHERE
    transactions.trans_datetime BETWEEN '2014-09-14 00:00:00' AND '2015-09-13 23:59:00'
    GROUP BY 
    transactions.trans_timestamp DIV 86400

那应该选择一年中进行的交易,按天(86,400秒)分组。

这个想法是timestamp字段,它包含与datetime相同的值,但是作为一个timestamp ...我发现这比UNIX_TIMESTAMP(trans_datetime)快,它除以我希望在时间间隔中得到的秒数。

问题:查询很慢。 我的处理时间超过4秒。 这是EXPLAIN的结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
    1   SIMPLE  transactions    ALL trans_datetime,trans_timestmp   NULL    NULL    NULL    6162558 Using where; Using temporary; Using filesort

问题:是否可以对此进行更好的优化? 这种结构或方法有缺陷吗? 我尝试了几种方法,但仅成功获得了适度的毫秒级增益。

表中的大多数数据是最近12个月的数据? 因此,您需要触摸大部分桌子吗? 那么有没有方法,以加快查询了。 但是,您可以更快地获得相同的输出数量级...

创建一个汇总表。 它具有一个DATE作为PRIMARY KEY ,并且这些列实际上是SELECT提到的字段。

最初填充汇总表后,请通过每晚在该天的交易中添加新行来对其进行维护。 在我的博客中有更多内容

然后,查询以获取所需的输出将命中此摘要表(只有几百行),而不是具有数百万或行的表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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