新手问题 我是否应该使用 mongodb?(即 mongodb 能比 mysql 更好的解决我面临的问题吗?)

ruohanc · 2013年06月10日 · 最后由 rubyu2 回复于 2014年05月04日 · 10510 次阅读

小弟正在尝试写一个类似监控中心的应用. 数据量说多不多, 说少不少. 每天 12W 条数据. 数据库大小每天增加 20M.

有了数据自然要从各个维度去分析. 从时间维度, 机房维度, 机器型号维度等等. 如果我一次取出 12W 条数据, 不说 mysql 在默认配置下查询费时 2s 以上, 而在 ruby 中建立如此大的一个数组也要耗费近 10s. 更别说做后续更多的判断和统计逻辑. 不敢想象如果我以后要分析一周, 一个月的数据会演变成什么样的情况.

于是我冒出了一个 "是不是该试试 mongodb" 的想法, 这回我正在通往啃 mongodb 文档的路上, 顺便向各位前辈们请教, mongodb 是否能较为快速(指性能)的满足我的想法. 谢谢啦.

共收到 22 条回复

说名你的程序写有很多需要改进的地方

#1楼 @hello_little_yy 嗯..要不然也不发新手问题里了么. 想不到怎么避免用 ruby 存这么大数组的问题. 逻辑有点复杂, 只用 sql 语句应该是很难实现了. 所以在找一个在数据库层面就能快速筛选目标的方案..

不应该。mongodb做分析也不是擅长的。压缩你的数据结构,让他们尽量的紧凑,使用redis做数据维度的分析。

这种应用场景算是 mongodb 非常适用的,可以试试。可以在插入的统计,即插入的时候同时插入 N 张表。也可以在后台定时做 mapreduce

#3楼 @jimrokliu #4楼 @doitian 我明白了, 果然是我处理方法有问题. 我应该在插入的时候就开始按照统计的维度收集规划数据. 按照 @jimrokliu 的意见是用 redis 做. 按照 @doitian 的说法就是如果用 mongodb 做 db 的话, 它本身就很适合胜任前面 "redis" 的工作.

这样理解的可对?

大数据分析你应该试试别的方案,查查公司的 HBase 的服务

#5楼 @ruohanc redis 多用于缓存,配合mongodb 用也可以 ;-)

如果是临时方案,可以用mongodb搞,前提是你熟悉类似mysql这样关系数据库的设计(否则会把mongodb当做避难所,然后在关系数据上掉进坑里)。

如果是希望做一个生命周期超过1年的东西,并且暂时不太着急,建议寻求相关工具团队的专业帮助,让他们直接给你需要的东西,详细情况可以上班时候打我手机

CouchDB吧

#6楼 @huacnlee 一天才120K条记录也叫大数据?

#10楼 @bhuztez 心别太凶.....至少对单进程的 ruby 来说. 处理一天的数据要半分钟, 回头如果要处理一个月的那就得15分钟了. 而且每日的量会慢慢增加..

#8楼 @fsword 有道理. 我用了 mongodb 最后很可能在关系数据上掉在坑里.

#8楼 @fsword 专业的工具团队指的是数据仓库么....我前天提了 odps 的申请..然后被嫌数据量太小, 给拒绝了. T^T

#13楼 @ruohanc 不是数据分析的专业团队,是机群监控系统的专业团队,长久看是要把这块工作彻底交给别人来做的 PS: 上班的时候怎么不问我?

#14楼 @fsword 好吧...可是目前看还是要实在一点.

我现在一把处理了 30W 条数据, 似乎主要的瓶颈是卡在 ruby 建立 ActiveRecord::Relation 数组里面了, 花了好几分钟. 这个有啥建议么.... 我现在已经有 96W 行数据了, 全部处理一把伤不起啊.

#15楼 @ruohanc 对于数据分析而言,最重要的是处理的策略(或者说算法),无论用 MySQL 还是 MongoDB 都是一样。 我觉得你让 MySQL 处理数据,而不是加载到 Ruby 里处理会更好。数据应该在 MySQL 里完成计算统计(用 SQL 处理),然后把计算统计的结果放到一张统计表里,Ruby 只展示结果就好了,不需要 Ruby 参与数据的分析计算。

你的问题和数据库无关,而是分析数据的方法不对。

似乎主要的瓶颈是卡在 ruby 建立 ActiveRecord::Relation 数组里面了, 花了好几分钟. 这个有啥建议么

应该把分析算法推向数据,而不是把数据都拉出来再分析。

在数据分析上面,没有 NoSQL 数据库能和 SQL 数据库的分析灵活性相比的; 多维度数据仓库建立维护和分析也是非常成熟的技术了,可以去看看相关文献

#16楼 @vincent #17楼 @knwang 能稍微详细点吗.? 直接通过 SQL 拿出结果似乎是不太可能了, 逻辑有点怪. 比如我现在认为如果两个监控点监控同一个机器, 只要有一个监控点认为这个机器可用, 那我就简单的认为这个机器是可用的. 最后根据这个规则计算个可用率出来.

#19楼 @ruohanc 不是要从一个 SQL 中直接计算统计结果,而是在一个批处理的 SQL 文件(可能有很多个 SQL,还要生成临时表)定时处理,执行结果生成统计表,Ruby 是直接从统计表里拿结果。 我自己是这么干的。举个简单例子:一个网站,每天有大量的用户登录(大概几十万条记录),需要统计一个月内每天登录的人数。如果直接去登录日志表里做查询估计要半分钟。 我的处理方法是,每天凌晨的时候跑批处理 SQL,把结果放到一个 日登录数据统计表中,Ruby 的程序直接读这个统计表的数据就可以生成数据分析报告了。

#20楼 @vincent 确实..这是看起来最可行的办法了.

是不是定时监控,记录结果?可以考虑rrdtool

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册