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

83 天前
 iamtuzi3333
小弟目前遇到一个棘手的问题,就是现在咱们的公司用的数据库是 MongoDB ,目前出现吃内存严重现象,同时查询效率不高,数据其实很简单,但是量很多,都是传感器数据,现在每秒都有数据入库,都是一条条的 json ,现在用的 MongoDB ,单个集合就存储一个传感器的数据,但是我发现查询接口太慢了,查询过程只有一个字段去比较,就是大于 and 小于这个值的字段的所有数据,这个都很慢,数据关键一个字段就是 data 数组,200 个浮点数。大佬们有其他数据库推荐吗,不涉及多表联合查询,都是单表操作。
5752 次点击
所在节点    数据库
68 条回复
iamtuzi3333
83 天前
@otakustay 目前是没有索引,但是数据集合比较多,有几百个,
@wxf666 差不多是这个量,后续还会增加设备,采样率会变,就是这个精度会变,这样建立索引方便吗,
@Mithril 刚才 explain 一下,目前是没有索引,全扫,花了 16 秒,500 多万条文档,下午给字段 checkTime 加上索引试一试看看效果如果。
Mithril
83 天前
@wxf666 可以是可以,时序数据库的优点是针对时间戳作为主键这种场景做了特殊优化,但其中很多优化手段你在普通的关系型数据库里也能做。其它的你需要修改数据库本身,比如 TimeScale 就是基于 PostgreSQL 改的。

通用的关系型数据库,一般用的都是行存储。但你这 200 个列基本都不会同时用到,很多时候你只基于其中某个或者某几个数据进行统计。那么以时间戳分片,按列式存储的数据库可能更高效一些。

你当然可以按照时间范围拆表去限制检索范围,然后以时间戳做主键去做聚类索引。但你这么一套折腾下来效率还是没专门的时序数据库高,完全没必要这么搞。

就算你想把其它的关系型数据和这些东西放到同一个数据库里,但这些大体积数据的查询也一样会拖累你数据库实例的性能,还不如拆出去呢。
sospopo101343793
83 天前
一天才 8w 条。。。,mongoDB 完全没问题,根本不用担心性能问题,楼上觉得 mongodb 性能不行,完全是偏见,mongoDB 单 collection 存查 10 亿级别的数据完全没有问题。提前建好索引就行
2686291180
83 天前
mongodb 性能完全够用了,优化点:
1. 建索引
2. 分库分表
darkengine
83 天前
先建索引啊,之前优化过 mongoDB 的查询,一个索引就搞定。不要担心索引占空间,用空间换时间是常用的优化策略。
forschers
83 天前
我们的硬件数据存在了 Doris 数据库中 传感器数据要响应很快
brant2ai
83 天前
找个开源的时序数据库就解你的问题了。如果不想用时序库,上 Doris 也可以
iamtuzi3333
83 天前
@sospopo101343793 一个集合 8 万多,有几百个集合,一起同时写入。不是说性能不好,目前我是没有建立索引,尝试建索引看看效果,目前查询是全集合扫描。
@2686291180 第二个操作暂时不会,先尝试建立索引看看效果。
iamtuzi3333
83 天前
@forschers 这个数据库第一次听,主要是存储方便,读取简单。
@brant2ai 第一次听,我查询看看这种。
abcfyk
83 天前
600W 总量,每天新增 8W 这数据量不就是洒洒水么? 居然还能有性能瓶颈
1 、 换数据库
1.1 时序数据库,比如 TDengine ,InfluxDB 楼上很多人说过了
1.2 列式数据库,比如 ClickHouse ,Druid 等
2 、不换数据库
1.2 磁盘换 SSD 、写前转换成强 schema 数据,建索引,分库、分表等等
wupher
83 天前
- 时间戳加个索引就好了

- 如果只关心时间,时序数据库更方便

- 最新的 mongodb 也支持时序库了,但没在生产上使用过
fengpan567
83 天前
换 clickhouse
wenxueywx
83 天前
用时序数据库
iyaozhen
83 天前
一天 8W 条 真的是太少了。我见过 1s 几万的。
如果你 mongo 不太会就用 MySQL 存都行,分库分表或者表分区
iamtuzi3333
83 天前
@abcfyk 一个集合 8 万多,有几百个集合。数据库暂时不换了,目前建了索引,发现速度快了。
@wupher 也关心数据,目前加了索引,速度起来了。
@fengpan567 没有用过。

@wenxueywx 还在调研中。
@iyaozhen 目前我知道插入不是问题,目前是查询较慢,现在建立了索引,快起来了。
iamtuzi3333
83 天前
谢谢各位大佬啦,小弟现在把对应的集合建立了时间戳字段建立了索引,速度立马起来了,优化到几十 ms 级别的查询时间;至于性能这个问题,写入肯定是没有问题,MongoDB 确实很优秀,简单好用;目前唯一的问题就是确实吃内存,这个修改了配置文件的参数目前还是没有办法避免,这个空间换时间确实无法避免;小弟去年刚毕业,来的一家小公司,只有我是搞开发的,领导把整个项目都丢给我了,小弟经验不足,所以有很多不同的地方,还请各位大佬多多指教。
raptor
83 天前
吃内存就加,钱能解决的问题都不是问题
cavemannb
83 天前
@iamtuzi3333 #56 既然查询很少,基本的数据库就能满足需求,不需要用到 MongoDB ,把数据放到内存里
zglzy
83 天前
厚脸皮推荐下 GreptimeDB 是时序数据库,内存也吃得挺少,查询性能不错,还有 pipeline 可以预处理 json 再写入(如果数据结构相对确定的话
iamtuzi3333
83 天前
@cavemannb 数据比较多,基本的关系型还是差点意思,同行业的很多公司是直接存文件,这个难度更大一点。查数据方面。
@zglzy 感谢,我查查,数据结构比较稳定。

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

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

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

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

© 2021 V2EX