时间序列数据的键值存储?

toa*_*ven 12 database time-series

我一直在使用SQL Server存储几十万个对象的历史时间序列数据,每天观察大约100次.我发现查询(给我在时间t1和时间t2之间的对象XYZ的所有值)太慢(对于我的需要,慢是超过一秒).我按时间戳和对象ID索引.

我接受了使用像MongoDB这样的键值商店的想法,但我不确定这是否是对这种事物的"适当"使用,我找不到任何提及使用这样的东西时间序列数据的数据库.理想情况下,我可以执行以下查询:

  • 在时间t1和时间t2之间检索对象XYZ的所有数据
  • 执行上述操作,但每天返回一个日期点(第一个,最后一个,关闭到时间t ...)
  • 检索特定时间戳的所有对象的所有数据

应该对数据进行排序,理想情况下,编写新数据以及更新现有数据应该快速.

似乎我希望按对象ID和时间戳查询可能需要以不同的方式索引数据库的两个副本以获得最佳性能......任何人都有建立像这样的系统的经验,具有键值存储,或HDF5,还是其他什么?或者这在SQL Server中完全可行,我只是不做对吗?

kri*_*ina 3

听起来 MongoDB 非常适合。更新和插入速度非常快,因此您可能需要为每个事件创建一个文档,例如:

{
   object: XYZ,
   ts : new Date()
}
Run Code Online (Sandbox Code Playgroud)

然后你可以对 ts 字段建立索引,查询也会很快。(顺便说一句,您可以在单个数据库上创建多个索引。)

如何进行三个查询:

检索时间 t1 和时间 t2 之间对象 XYZ 的所有数据

db.data.find({object : XYZ, ts : {$gt : t1, $lt : t2}})
Run Code Online (Sandbox Code Playgroud)

执行上述操作,但每天返回一个日期点(第一个、最后一个、截止时间 t...)

// first
db.data.find({object : XYZ, ts : {$gt : new Date(/* start of day */)}}).sort({ts : 1}).limit(1)
// last
db.data.find({object : XYZ, ts : {$lt : new Date(/* end of day */)}}).sort({ts : -1}).limit(1)
Run Code Online (Sandbox Code Playgroud)

最近一段时间,您可能需要一个自定义 JavaScript 函数,但它是可行的。

检索特定时间戳的所有对象的所有数据

db.data.find({ts : timestamp})
Run Code Online (Sandbox Code Playgroud)

如果您有任何疑问,请随时在用户列表中询问,其他人可能会想出一种更简单的方法来获取最近的事件。

  • 我不确定您过去是否使用过时间序列,但这种设计无法扩展。 (6认同)
  • @Matthieu N(或其他人)愿意详细说明吗? (3认同)