按时间自动聚合分区SQLtable

Automatically aggregate and partition SQL table by time

我有以下 SQL table 用于网络中由时间戳定义的流,流中的节点。每个流都有一个体积。

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

目前 table 包含 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

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

因此,对于从 07/17/16 10 PM 到 07/19/16 6 AM 的时间范围的查询将按时间戳拆分,并按范围 07/17 的标准 1 小时 table 回答/16 10 PM 到 07/17/16 12 PM,然后是 07/18/16 12 AM 到 07/18/16 12 PM 从 24 小时开始 table 其余时间从 6 小时开始 table。

在 SQL 中有没有一种方法可以自动进行聚合和拆分以及查询的回答,这样我就不需要在我的应用程序中实现所有逻辑?

提前致谢!

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

当您尝试构建各种时间维度 tables.

时,您试图实现的似乎更像是一些数据仓库问题

如果你不介意用myisam table引擎代替innodb,那你可以考虑用merge table engine:

The MERGE storage engine, also known as the MRG_MyISAM engine, is a collection of identical MyISAM tables that can be used as one. “Identical” means that all tables have identical column and index information.

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

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