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

22 天前
 iamtuzi3333
小弟目前遇到一个棘手的问题,就是现在咱们的公司用的数据库是 MongoDB ,目前出现吃内存严重现象,同时查询效率不高,数据其实很简单,但是量很多,都是传感器数据,现在每秒都有数据入库,都是一条条的 json ,现在用的 MongoDB ,单个集合就存储一个传感器的数据,但是我发现查询接口太慢了,查询过程只有一个字段去比较,就是大于 and 小于这个值的字段的所有数据,这个都很慢,数据关键一个字段就是 data 数组,200 个浮点数。大佬们有其他数据库推荐吗,不涉及多表联合查询,都是单表操作。
4986 次点击
所在节点    数据库
68 条回复
Mithril
22 天前
IoT 不涉及到修改数据吧,什么叫“时间戳的值会一直变”?难道你会频繁修改已经入库数据的时间戳?
encro
22 天前
高性能 与 free scheme ,低内存那是天然冲突。。。
sagaxu
22 天前
时间戳字段为什么一直会变?监控数据不是一直追加上去的吗?只存储设备的当前状态,不断 update 吗?

所有 DB 本质都是一样的,查找数据要么遍历,要么走索引,数据量一大,遍历必然是很慢的,要通过高区分度的索引加速查找,若没法建立高质量索引,那只能 case by case 特别优化了
iamtuzi3333
22 天前
@sunxvvv 现在有一个字段是 int 整形,存储的是当前时间戳的值,每条写入的时候都有会,这样子适合建立吗,真实查询数据的场景不是很多,偶尔需要查询。
@halov 直接占了快 60G ,同时他的 mapper file 会持续上涨,备用内存全是这个内容,导致可用内存最后剩下不到 100M ,服务器 192GB 的内存都给干满了。
@Mithril 是的,不涉及修改,就是现在数据入库我为了查询方便,就加了一个字段,这个字段存的值就是当前时间戳的值。
@encro 唉,难受,这个确实没办法完美解决,而且其他数据库适合存的情况下接口又不方便。哭了
iamtuzi3333
22 天前
@sagaxu 数据不是追加的,每秒都会有新的数据入库,设备数据采集频率很高,所以数据很多,比如说 200Hz ,就说明每秒都有一条数据出来,其中的 data 数组就存储了 200 个浮点数,这种情况下如何编写索引,遍历随着数据量增长,到后面基本没办法找去年的数据出来了。
lancelock
22 天前
用时序数据库没问题阿,点多有什么关系,数组类型的可以拆开存吧
LieEar
22 天前
“数据其实很简单,但是量很多,都是传感器数据,现在每秒都有数据入库”

这是典型的时序数据库需求,可以试试
wxf666
22 天前
@iamtuzi3333 #24

换成一般关系数据库,你的表结构是这样吗:

( ID ,设备 ID ,毫秒时间戳,浮点数据),其中加了(设备 ID ,毫秒时间戳)索引,

你查询需求是:某设备,在某时间段内的,所有浮点数据?
sagaxu
22 天前
@iamtuzi3333 时间戳字段建个索引试试看吧,数据量大,新增索引可能要建个几分钟几十分钟的。建完索引,再查查看,如果还慢,把查询计划贴出来分析分析。
iamtuzi3333
22 天前
@lancelock 有一个关键字段就是数组,里面有 200 个元素,就是拆除 200 个 key 对应 value 么
@LieEar 开源的 influxdb 想试试,刚看了一下,发现还行,就是要拆数据字段,不知道查询效果怎么样,比如说多传感器能不能多表存储,就一个传感器一张表
iamtuzi3333
22 天前
@wxf666 是的,浮点数据这个字段是一个数组,里面数量就看设备的采样率决定。查询需要翻找某一段时间的所有浮点数数据出来。
@sagaxu 主要是更新索引很耗资源,当集合文档数上百万的时候,这个时候维护索引估计很难,而且不止一个集合,有几百个传感器
Geekerstar
22 天前
我用的 TDengine ,目前几十亿数据,查询很快
gabriel_zhen
22 天前
@corcre 专业的事情 专业的数据库干
sagaxu
22 天前
@iamtuzi3333 “当集合文档数上百万的时候,这个时候维护索引估计很难”,这是哪里看到的理论啊,再烂的索引,支撑个上亿级别的数据量,也是没有问题的。这个时间戳是固定的,一条数据入库之后就不会更新,不会损失很多性能的,时间戳的分布也很均匀,区分度很高,是个优质索引。
iamtuzi3333
22 天前
@sagaxu 真的吗,那我就开干了,可以在已经插入数据的情况再去建立索引吗
Mithril
22 天前
@iamtuzi3333 这不就是正常建立索引的东西吗?

你试试查询的时候 explain 一下,到底是命中索引了,还是直接全扫了。你这个数据量不加索引搜不出来东西的。

建议好好看看 MongoDB 文档,如何处理时间序列数据。MongoDB 支持建立时序集合的。

https://www.mongodb.com/zh-cn/docs/manual/core/timeseries-collections/
wxf666
22 天前
@iamtuzi3333 #31

你们一天,就要存几千万行,共计 几十 GB 数据吗?


如,假设 300 设备,每设备每秒 200 单精度浮点,

算下来,一天就有 300 x 86400 = 2600W 行数据?

光是存浮点数据,共计就要 2600W x 200 x 4 / 2 ^ 30 = 19.3 GB ?
wxf666
22 天前
@Mithril #36 这种普通关系型数据库,应该也没问题吧?

表结构:( 主键:《设备 ID ,毫秒时间戳》,200 个浮点数组)
otakustay
22 天前
一天 8W 条,一年也才 2400W 数据,怎么都不算多啊,我感觉你就确认下有没有索引,把索引建上,啥都不干查询性能的事情就解决了。内存的问题,就只能换数据库了,随便 mysql 还是 postgre 加个索引也够了
gongguowei02
22 天前
@Geekerstar 这么厉害,我去了解一下,谢谢~

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

https://www.v2ex.com/t/1075881

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

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

© 2021 V2EX