小弟目前遇到一个棘手的问题,就是现在咱们的公司用的数据库是 MongoDB ,目前出现吃内存严重现象,同时查询效率不高,数据其实很简单,但是量很多,都是传感器数据,现在每秒都有数据入库,都是一条条的 json ,现在用的 MongoDB ,单个集合就存储一个传感器的数据,但是我发现查询接口太慢了,查询过程只有一个字段去比较,就是大于 and 小于这个值的字段的所有数据,这个都很慢,数据关键一个字段就是 data 数组,200 个浮点数。大佬们有其他数据库推荐吗,不涉及多表联合查询,都是单表操作。

索引建了吗?数据文档的字段是否都是一致的,是的话用单字段索引,不是的话用稀疏索引。试试,按照你的描述很可能没有索引导致全集合扫描了。

postgres 不就可以么?

索引没建立,我是按照一个时间戳字段去查询,这个值一直在变,没法用索引吧。 我查一下这个。

文档的字段都是一致的,估计是,因为文档数量非常的多,每秒一条,一天有 8 万多条了。

采集的数据吗, 我们乙方用的时序数据库(TDengine), 不存数组, 按采集点位存的数据, 每个时间每台设备每个点位一条数据, 暂时没什么问题(但是我没具体了解过我们对性能的要求)

1.MongoDB 本来就非常吃内存,高性能都是建立在内存的基础上的2.给时间戳字段加上索引3.看一下单表数据量,实在太多考虑将查询功能放到 ES(需要评估)

如果按照时间戳查询,建议用时序数据库( TSDB ),把你要存储的值当作度量处理。你这个场景感觉 IoT 方向啊,怎么会选型用 mongo 。

一个点位的一个数的话时序数据库很方便,但是数据就很麻烦,我之前找过 influxdb ,感觉不太行。

你的建议是对的。

数据是 loT 。但是时序数据库一个麻烦的点就是我没有找到有很好的字段支持,很多时序数据库都是一个时间点对应一个值,我的数据字段比较多,还有数组类型在里面,不好处理。 时间戳的值会一直变,这样索引更新不是更加消耗资源吗,单表数据量目前是 600 多万条文档了,每天 8 多万增加。

我们已经转时序 tdengine 了,10w 台设备,频率每天 1-24 条不等,目前没啥问题

数据字段是一个值吗,就一个时间字段映射一个值? 现在麻烦的就是字段特别多,不同的类型也多,有数组这些。

clickhouse 试试呢

不知道你测试的是哪个数据库,例如 influxDB 中 Point 可以包含多个 Fields 的。一条记录多个属性值。试试看吧,IoT 都用时序的。

mongodb 5.0 之后也支持时序功能 www.mongodb.com/zh-cn/docs/manual/core/timeseries-collections/建议先去尝试优化

我先搜一下,只有我一个人,顶着公司走,难受。。。 似乎接口有点复杂,我先看看。 好的,我先去试试优化,其实 MongoDB 存是非常的方便,就是吃内存很严重,即使修改了配置文件的内容。

你不建索引,每一次的查询都是全集合扫描,随着数据越多,查询只会越来越慢,索引带来的内存和 CPU 消耗绝对比你每一次都是全集合扫描少得多,索引是肯定利大于弊的,用 MongoDB 的话,数据量实在太大,可以上分片

每次看到使用 MongoDB 的,我就想和他说一句“没有银弹”。。。

这个肯定要用时序数据库了.

MongoDB 用了多少内存

IoT 不涉及到修改数据吧,什么叫“时间戳的值会一直变”?难道你会频繁修改已经入库数据的时间戳?

高性能 与 free scheme ,低内存那是天然冲突。。。