【发布时间】:2012-05-16 00:31:50
【问题描述】:
我发现了一些与此相同的问题,但它们没有详细说明所存储数据的性质、如何查询数据等......所以我认为这值得发布。
我的数据很简单,三个字段: - “日期时间戳”值(日期/时间) - 两个字符串,“A”和“B”,都
我的应用程序的写入量很大(每秒数百次)。所有写入都是新记录;一旦插入,数据永远不会被修改。
定期读取每隔几秒发生一次,用于填充一些近乎实时的仪表板。我查询日期/时间值和字符串值之一。例如获取日期时间戳在特定范围内且字段“B”等于特定搜索值的所有记录。这些查询通常每个返回几千条记录。
最后,我的数据库不需要无限增长;如果数据库支持,我会通过手动删除或使用缓存过期技术来清除 10 天以上的记录。
我最初在 MongoDB 中实现了这一点,没有意识到它处理锁定的方式(写入块读取)。随着我的扩展,我的查询花费的时间越来越长(现在 30 多秒,即使有正确的索引)。现在,根据我所学到的,我相信大量的写入正在耗尽我的阅读。
我已经阅读了kkovacs.eu 比较各种 NoSQL 选项的帖子,虽然我学到了很多东西,但我不知道我的用例是否有明显的赢家。非常感谢熟悉这些选项的人的推荐。
提前致谢!
【问题讨论】:
-
您在记录什么需要每秒数百次写入才能为实时仪表板填充数据库?
-
@eaolson 我正在记录发生的事件,我无法控制向我输入的内容。这两个字符串标识“what”和“where”。查询主要是“选择过去 5 分钟内位置 [x] 处的所有事件”之类的内容。结果被缓存并与先前查询的结果(来自先前的时间片)相结合,并绘制在仪表板上。
-
我建议您重新考虑是否需要将所有这些数据记录在数据库中。您能否汇总 100 毫秒的数据并仅存储汇总数据?根据@ValBakhtin,我相信 SQLite 在写入时会锁定整个数据库文件,这听起来使它不适合这个应用程序。
-
您是同时查询 A 和 B 还是只查询 B?时间是否始终是查询的一部分,即您可以有一个没有时间的查询吗?同样,是否有只有时间的查询? A/B 可以采用的值是固定的吗?
-
好的,到目前为止,我知道您需要非常快速地写入数据 选择查询的执行频率如何?就像在一些刷新计时器/每天/每周的飞行中,...?