AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 14533
Accepted
RockScience
RockScience
Asked: 2012-03-07 23:46:36 +0800 CST2012-03-07 23:46:36 +0800 CST 2012-03-07 23:46:36 +0800 CST

我应该如何在mongodb中存储时间序列

  • 772

我需要创建一个时间序列数据库,并执行以下任务:

  • 创建新的时间序列
  • 更新现有时间序列
  • 一次查询一个或多个时间序列(例如同一日期的所有时间序列等...)

Mongo 是否适应了这一点,如果是,我应该如何构建数据库?(一个时间序列=一个文档?或者一个文档=一个时间序列条目,所有这些文档形成一个集合,即整个时间序列?)

我在这里有点迷茫,我发现很难找到任何信息,因为通常 Mongo 非常灵活,因此用户可以在基础架构中进行选择。

任何专门解释如何在 Mongo 中管理时间序列的教程链接都非常受欢迎。

谢谢!

mongodb
  • 3 3 个回答
  • 18773 Views

3 个回答

  • Voted
  1. Best Answer
    Leftium
    2012-03-15T19:57:12+08:002012-03-15T19:57:12+08:00

    我建议每个文档有一个时间序列条目。每个文档存储多个条目存在一些问题:

    • 单个文档限制为一定大小(当前为 16 MB);这限制了单个文档中可以存储多少条目
    • 随着更多条目添加到文档中,整个文档(和时间序列)将被不必要地删除并重新分配到更大的内存
    • 与对常规文档的查询相比,对子文档的查询受到限制
    • 具有非常扁平结构的文档(例如每秒一个子文档)性能不佳
    • 内置的 map-reduce 在子文档上效果不佳

    另请注意,默认 MongoDB ObjectId 内置了时间戳。如果时间序列精度小于一秒,您可以使用它。

    这是来自使用 MongoDB 的事件日志库的示例 BSON 文档:

    Example format of generated bson document:
    {
        'thread': -1216977216,
        'level': 'ERROR',
        'timestamp': Timestamp(1290895671, 63),
        'message': 'test message',
        'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
        'lineNumber': 38,
        'method': 'test_emit_exception',
        'loggerName':  'testLogger',
        'exception': {
            'stackTrace': 'Traceback (most recent call last):
                           File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                           raise Exception(\'exc1\')
                           Exception: exc1',
            'message': 'exc1',
            'code': 0
        }
    }
    

    由于事件日志类似于时间序列,因此可能值得研究其余代码。有 Java、C#、PHP 和 Python 版本。

    这是另一个类似的开源项目:Zarkov


    [更新]作为对@RockScience 评论的回应,我添加了更多参考资料:

    • 关于如何使用 MongoDB 存储时间序列的非常详细的案例研究。有趣的部分:
      • 幻灯片 25:有多少数据?20 个 4 字节数据点,每 1 分钟间隔 10 年(如果这些是实际统计数据或只是预测估计,则不明显)
      • 幻灯片 66:显示用于存储时间序列数据的示例 MongoDB 文档
    • 存储日志数据的最佳实践,直接来自 MongoDB 的创建者
    • 6
  2. Aaron
    2012-03-25T04:11:56+08:002012-03-25T04:11:56+08:00

    我在 SO(https://stackoverflow.com/questions/4814167/storing-time-series-data-relational-or-non)上发现了这个问题,其中 OP 询问如何存储时间序列。尽管他的问题更多地基于使用 NoSQL 数据库或 RDBMS,但您似乎很愿意使用 NoSQL 数据库。

    还发现这篇关于“时间序列数据的独特数据库要求”的文章可能有用。

    希望这可以帮助。

    • 2
  3. Naim Zard
    2015-07-03T12:13:32+08:002015-07-03T12:13:32+08:00

    是的,NoSQL 数据库比传统的 RDBMS 更适合存储时间序列数据。

    是的,MongoDB 非常适合这个用例。

    - 你应该如何构建数据库?一份文档 = 一个时间序列输入 VS 多个时间序列。

    答案是在一个文档中存储多个时间序列。拥有更少的文档将有助于减少读取的性能。一个技巧是使用预定义的值准备文档。这将通过避免Record Padding来优化更新文档。

    下面是一个关于如何以分钟间隔以最佳方式存储一个小时的时间序列的模式示例:

    {
      timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
      type: “memory_used”,
      values: {
        0: 999999,
        1: 1000000, 
        …,
        58: 0,
        59: 0
      }
    }
    

    您使用 0 值启动它,然后将优化更新。读取得到了优化,因为读取了一个文档而不是 60 个。如果您需要存储一天的数据,或者一个月,您继续使用相同的技术,您就会明白这一点。

    这是一个教程的链接,该教程专门解释了如何在 MongoDb 官方博客中管理时间序列:http: //blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb

    • 2

相关问题

  • Mongo Map-Reduce 还是分片?

  • 使用集群设置 Mongo

  • MongoDB 的 find 和 findone 调用之间的区别

  • 分片对小集合有效吗?

  • 关于操作/管理 MongoDB 的良好资源

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve