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

宗主

我有一张比特币交易表:

    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)缺省NULL,
      `trans_type` tinyint(4)缺省NULL,
      `trans_price`十进制(15,4)缺省NULL,
      `trans_amount`十进制(15,8)缺省NULL,
      `trans_datetime`日期时间缺省NULL,
      `trans_sid`bigint(20)默认NULL,
      `trans_timestamp`int(10)无符号默认NULL,
      主键(`trans_id`),
      键`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)作为trans_volume,
    MAX(transactions.trans_price)作为trans_max_price,
    MIN (transactions.trans_price)为trans_min_price,
    COUNT(transactions.trans_id)AS trans_count
    来自
    交易的
    WHERE 
    transaction.trans_datetime之间的“ 2014-09-14 00:00:00”和“ 2015-09-13 23:59:00” 
    GROUP BY 
    transaction.trans_timestamp DIV 86400

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

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

问题:查询速度很慢。我得到了4秒钟以上的处理时间。这是EXPLAIN的结果:

    id select_type表的类型possible_keys键key_len ref行额外的
    1个SIMPLE事务所有trans_datetime,trans_timestmp NULL NULL NULL 6162558使用where; 使用临时的;使用文件排序

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

里克·詹姆斯

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

创建一个汇总表。它会有一个DATEas PRIMARY KEY,并且列将有效地是您中提到的字段SELECT

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章