我使用influx db保存网站的性能数据。在我的influx db中的数据如下:
//mock data
time load
---- ----
2018-11-27T08:34:46.899z 262
2018-11-27T08:35:46.899z 300
2018-11-27T08:36:46.899z 102
2018-11-27T08:37:46.899z 1000
2018-11-27T08:38:46.899z 800
2018-11-27T08:39:46.899z 6000
2018-11-27T08:40:46.899z 326
2018-11-27T08:41:46.899z 500
2018-11-27T08:42:46.899z 90
2018-11-27T08:43:46.899z 902
我的目的是获得负载值的分布。例如,我想以如下形式获取加载时间的分布:
load frequent
---- ----
0~100 1
100~200 1
200~300 2
300~400 2
.
.
.
5000~6000 1
我尝试通过两种方式解决此问题,但我认为这不是获得此结果的最佳方法。
(一)查询整个加载时间,然后在我的nodejs服务器中计算此结果。我想当我想获得一年或更长时间的分配时,此解决方案将遇到性能问题。
(二)在将原始数据保存到influx db的同时,我计算加载时间的范围,然后将其保存到另一个influx db表中,计算如下表:
// load distribute table
time 100~200 200~300 300~400 .... 5000~6000
---- ---- ---- ---- ----
08:34:46 1
08:34:47 1
08:34:48 1
08:34:49 1
08:34:50 1
// then in the future I can get the distribution like this:
select count(*) from load_distribute
答案 0 :(得分:0)
我不知道仅在InfluxDB中进行范围分组的方法(按时间间隔除外)。
此外,即使关系数据库也依赖于CASE之类的SQL扩展,或那里的子查询联接-尽管Influx都不是关系数据库。
虽然保留在TICK堆栈中,但是您可以通过Kapacitor处理来完成,但这就是问题:它是TIMESERIES数据库。时间是关键,我不知道那里涉及的时间因素...
因此,也许最好的解决方案是执行一系列单独的查询,这些查询将计算每个范围中值的出现次数,然后将其放到您的应用中。
或按时间间隔在Kapacitor中加入相同的内容(例如,每10分钟批处理一次),将其稳定为一个度量,其中值名称将表示负载范围,而计数将是值(load0_99 = 3, load100_199 = 24,依此类推)-然后您就可以在一个查询中做到这一点。