大佬们,想请教一下数据库设计

2024-09-26 09:49:13 +08:00
 iamtuzi3333
小弟目前遇到一个棘手的问题,就是现在咱们的公司用的数据库是 MongoDB ,目前出现吃内存严重现象,同时查询效率不高,数据其实很简单,但是量很多,都是传感器数据,现在每秒都有数据入库,都是一条条的 json ,现在用的 MongoDB ,单个集合就存储一个传感器的数据,但是我发现查询接口太慢了,查询过程只有一个字段去比较,就是大于 and 小于这个值的字段的所有数据,这个都很慢,数据关键一个字段就是 data 数组,200 个浮点数。大佬们有其他数据库推荐吗,不涉及多表联合查询,都是单表操作。
7406 次点击
所在节点    数据库
68 条回复
celaraze
2024-09-26 10:00:37 +08:00
索引建了吗?数据文档的字段是否都是一致的,是的话用单字段索引,不是的话用稀疏索引。试试,按照你的描述很可能没有索引导致全集合扫描了。
flmn
2024-09-26 10:00:59 +08:00
postgres 不就可以么?
iamtuzi3333
2024-09-26 10:12:20 +08:00
@celaraze 索引没建立,我是按照一个时间戳字段去查询,这个值一直在变,没法用索引吧。
@flmn 我查一下这个。
iamtuzi3333
2024-09-26 10:13:10 +08:00
@celaraze 文档的字段都是一致的,估计是,因为文档数量非常的多,每秒一条,一天有 8 万多条了。
corcre
2024-09-26 10:17:47 +08:00
采集的数据吗, 我们乙方用的时序数据库(TDengine), 不存数组, 按采集点位存的数据, 每个时间每台设备每个点位一条数据, 暂时没什么问题(但是我没具体了解过我们对性能的要求)
seedhk
2024-09-26 10:18:29 +08:00
1.MongoDB 本来就非常吃内存,高性能都是建立在内存的基础上的
2.给时间戳字段加上索引
3.看一下单表数据量,实在太多考虑将查询功能放到 ES(需要评估)
celaraze
2024-09-26 10:22:12 +08:00
@iamtuzi3333 如果按照时间戳查询,建议用时序数据库( TSDB ),把你要存储的值当作度量处理。你这个场景感觉 IoT 方向啊,怎么会选型用 mongo 。
iamtuzi3333
2024-09-26 10:22:15 +08:00
@corcre 一个点位的一个数的话时序数据库很方便,但是数据就很麻烦,我之前找过 influxdb ,感觉不太行。
celaraze
2024-09-26 10:23:13 +08:00
@corcre 你的建议是对的。
iamtuzi3333
2024-09-26 10:24:51 +08:00
@celaraze 数据是 loT 。但是时序数据库一个麻烦的点就是我没有找到有很好的字段支持,很多时序数据库都是一个时间点对应一个值,我的数据字段比较多,还有数组类型在里面,不好处理。
@seedhk 时间戳的值会一直变,这样索引更新不是更加消耗资源吗,单表数据量目前是 600 多万条文档了,每天 8 多万增加。
yoyolichen
2024-09-26 10:27:32 +08:00
我们已经转时序 tdengine 了,10w 台设备,频率每天 1-24 条不等,目前没啥问题
iamtuzi3333
2024-09-26 10:28:51 +08:00
@yoyolichen 数据字段是一个值吗,就一个时间字段映射一个值? 现在麻烦的就是字段特别多,不同的类型也多,有数组这些。
Desdemor
2024-09-26 10:32:07 +08:00
clickhouse 试试呢
celaraze
2024-09-26 10:32:53 +08:00
@iamtuzi3333 不知道你测试的是哪个数据库,例如 influxDB 中 Point 可以包含多个 Fields 的。一条记录多个属性值。试试看吧,IoT 都用时序的。
zhazi
2024-09-26 10:35:12 +08:00
mongodb 5.0 之后也支持时序功能
https://www.mongodb.com/zh-cn/docs/manual/core/timeseries-collections/
建议先去尝试优化
iamtuzi3333
2024-09-26 10:39:24 +08:00
@celaraze 我先搜一下,只有我一个人,顶着公司走,难受。。。
@Desdemor 似乎接口有点复杂,我先看看。
@zhazi 好的,我先去试试优化,其实 MongoDB 存是非常的方便,就是吃内存很严重,即使修改了配置文件的内容。
sunxvvv
2024-09-26 10:40:47 +08:00
你不建索引,每一次的查询都是全集合扫描,随着数据越多,查询只会越来越慢,索引带来的内存和 CPU 消耗绝对比你每一次都是全集合扫描少得多,索引是肯定利大于弊的,用 MongoDB 的话,数据量实在太大,可以上分片
encro
2024-09-26 10:42:34 +08:00
每次看到使用 MongoDB 的,我就想和他说一句“没有银弹”。。。
zhangeric
2024-09-26 10:42:35 +08:00
这个肯定要用时序数据库了.
halov
2024-09-26 10:42:58 +08:00
MongoDB 用了多少内存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1075881

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX