按时间自动聚合和分区SQL表

时间:2016-07-19 10:24:57

标签: mysql timestamp aggregate database-partitioning

对于网络中的流,我有以下SQL表,这些流由时间戳(流中的节点)定义。每个流量都有一个量。

| ID | timestamp | source | handover | nexthop | destination | volume |
|----|-----------|--------|----------|---------|-------------|--------|
| 01 | 123456788 | src001 | hnd 001  | nxt 002 | dst 001     | 1.23   |
| 02 | 123456789 | src002 | hnd 001  | nxt 002 | dst 003     | 4.32   |
| .. | ......... | ...... | .......  | ....... | .......     | ....   |

目前该表包含2600万行(大约2个月的数据),并且由于每小时每个流都有条目,因此它会快速增长。

目前我正在进行查询以获得关于任意时间范围(例如8天)的总流量,并对这样的节点进行过滤:

SELECT  source, handover, nexthop, destination, sum (volume)
WHERE   timestamp >= ts_start AND timestamp <= ts_end 
        AND ( source = 123 OR source = 345 ) AND ( nexthop = 789 )
GROUP BY source, handover, nexthop, destination

随着我们的数据库变得越来越大,并且需要加速我们已经很慢的查询,我想将表分成不同的时间片(例如6小时,12小时,24小时),但所有这些表共存。

因此,从07/17/16 10 PM到07/19/16 6 AM的时间范围的查询将按时间戳分开,并由标准1小时表回答,范围为07/17/16 10 PM to 07 / 17/16 12 PM,然后是07/18/16 12 AM到07/18/16 12 PM,来自24小时表,其余部分来自6小时表。

在SQL中是否有办法自动进行聚合和拆分以及回答查询,以便我不需要在我的应用程序中实现所有逻辑?

提前致谢!

1 个答案:

答案 0 :(得分:1)

简短的回答是:不,MySQL没有这样的内置功能。 MySQL确实支持表分区,但是,您需要为每个分区指定确切的范围,因为MySQL必须能够清楚地确定哪个记录属于哪个分区。单个记录必须位于单个分区中。

当您尝试构建各种时间维度表时,您尝试实现的内容似乎更像是一些数据仓库问题。

如果您不介意使用myisam表引擎而不是innodb,那么您可以考虑使用merge table engine

  

MERGE存储引擎,也称为MRG_MyISAM引擎,是可以作为一个使用的相同MyISAM表的集合。 “相同”表示所有表都具有相同的列和索引信息。

这样您就可以拥有重叠数据(多个表中的相同记录)。如果您知道需要特定6小时的数据,那么您只能查询单个表。或者,如有必要,您可以查询整个合并表。

否则,您必须编写自己的解决方案。