`
longpo1988
  • 浏览: 850 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

mongodb学习中的困惑,希望能得到大家的帮助。

 
阅读更多
各位好,我目前遇到个问题,困扰了好久,希望大家能够给个指点。我们项目之前用的mysql,但考虑以后的数据量的发展趋势,考虑用mongodb,但就目前测试的情况而言,处理速度不是很理想,但我又担心是因为我自己测试有误,所以想听听各位的意见,谢谢。

mysql中有三个表:item(id,name)、theme(id,word)、itemtheme(itemid,themeid,word,type,weight);

其中item 和theme是多对多的关系,所以抽出关系表itemtheme用于存放关联关系。

现在的业务逻辑是 做这样的一个操作   需要根据若干个theme.word查出 具有这些 word的item,并按照这若干个word的weight之和倒序排列,取出前200个itemid,举例说:

itemtheme中有


itemid themeid word type weight
101 11 china 1 100
101 12 gps 2 200
101 13 iphone 3 300
102 12 gps 1 100
102 13 iphone 2 200




根据上图的模拟数据,我的应用需要做这样的事情:找出 有china 和gps这两个word的itemid,然后对 china和gps这两个word的weight相加,然后按照这个和倒序排列,所以这个实例中得出的结果是 101 300.   sql语句 就是

select t1.itemid, (t1.weight + t2.weight) as sumWeight
from itemtheme t1
inner join itemtheme t2 on t1.itemid = t2.itemid
where t1.word= china and t2.word = gps
order by sumWeight desc;


现在我们向移植到mongodb上来,有一个集合叫做item 结构为:

{
        "_id" : ObjectId("4faae54a1ba46159a6ca4bfd"),
        "itemid" : 101,
        "name" : "iphone4s",
        "theme" : [
                {
                        "word" : "gps",
                        "weight" : 200,
                        "type" : 2
                },
                {
                        "word" : "china",
                        "weight" : 100,
                        "type" : 1
                }
        ]
}
所以为了完成上面的应用,我就用了mapreduce:

var mr = db.runCommand(
{
mapreduce:"item",
map:function(){
  varid = this.itemid;
  this.theme.forEach(function(t){
  if((t.word =="gps")||(t.word =="china")){
     emit(id,{weight:t.weight,word:t.word});
   }
  });
},
reduce:function(key,values){
  sumWeight = 0;
   for(var i=0;i<values.length;i++){
     var w = values[i].word;
     sumWeight += values[i].weight;
    }
   return{"weight":sumWeight};
},
query:{
   "theme.word":
       {
           $all:
              [
                "gps",
                "china"
              ]
       },
  },
out:"INLINE"
});

db[mr.result].find().sort({"value.weight":-1});

目前数据量 是1000万,也就是1000万个item,但目前我发现有几个问题不是很理解:

1. mapreduce的速度没有 mysql的快,请问我这个测试结果正确吗?

2. 有没有什么方法加快mapreduce的速度?

3. 官网说mapreduce 是为了再分布式下处理海量数据,mysql再怎么优化,都是由瓶颈的,所以才会出现nosql,那么要多大的数据量才选择放弃mysql用mongodb呢?

4. 网上有说 用hadoop的mapreduce 通过Mongodb Hadoop Connector 调用mongodb这样能加快处理速度,但就目前而言  我的观察是,hadoop的mapreduce启动时间就需要几秒,而目前我1000万数据用mongodb的mapreduce也是几秒能完成,貌似用hadoop的mapreduce有点大才小用了,不知道我这理解正确不?


ps:我个人觉得,还是数据量的问题,如果需求需要达到TB级别的,那么用mysql就不行了,这时就得考虑nosql 而作为mysql最好的nosql替代品,用mongodb是最合适的,mongodb有点中型nosql的感觉,而hadoop 的hbase 这一套体系有点巨型的感觉。而且我们的设计之前是基于关系数据库的思想,所以用nosql有点牵强,毕竟nosql的数据库是很弱化sql操作的,大部分的设计思想在设计层面就得抛弃关系数据库的思维,而用key-value的思维来设计数据库,但目前我们的应用是不可能变更设计的,所以这也是个很难平衡的问题,mapreduce本身就不是为了追求实时性,不是为了追求速度的,但mongodb本身的性能非常不错,find操作的速度是mysql的5倍以上,但关键是我们的应用用find实现不了,所以非常想听听各位前辈的意见,请多多指教,非常感谢!
分享到:
评论

相关推荐

    MongoDB 学习资料集锦

    总的来说,"MongoDB 学习资料集锦" 提供了全面的学习路径,从基础到高级,理论与实践并重,帮助你成为MongoDB的专家。通过深入阅读和实践,你可以掌握这个强大的数据库系统,从而在数据驱动的应用中发挥其潜力。

    MongoDB学习文档.zip

    MongoDB是一种流行的开源、分布式文档数据库,被广泛用于存储非结构化和半结构化数据。...通过深入学习这份文档,开发者可以掌握如何在Java应用程序中充分利用MongoDB的特性,实现高效、可靠的数据存储和处理。

    mongodb学习笔记资料

    mongodb学习笔记资料,从安装到操作库collection 对document的crud 索引 replicaSet sharding 备份与恢复

    MongoDB;学习资料

    学习MongoDB的过程中,建议先从安装和基本操作开始,然后逐渐深入到高级特性如分片和复制集。实践是提升技能的关键,可以尝试创建数据库、插入和查询数据,再逐步学习如何处理更复杂的数据操作和系统管理。同时,...

    收集的mongodb开发学习资料

    11. **MongoDB驱动程序**:MongoDB有多种编程语言的驱动程序,如Python的PyMongo、Java的MongoDB Java Driver等,学习如何在不同语言中与MongoDB进行交互是开发中的关键。 12. **最佳实践**:包括数据模型优化、...

    mongodb学习手册.pdf

    ### MongoDB学习手册精要知识点概览 #### 一、MongoDB简介 MongoDB,源于英文单词“humongous”,意指其设计初衷在于处理海量数据。作为一款开源、面向文档的NoSQL数据库,MongoDB凭借其灵活性和高性能,迅速成为...

    Mongodb 学习 PPT上课教程

    4. 高可用性: MongoDB 支持在复制集(Replica Set)通过异步复制达到故障转移,自动恢复,集群中主服务器崩溃停止服务和丢失数据,备份服务器通过选举获得大多数投票成为主节点,以此来实现高可用。 5. 水平拓展: ...

    五、MongoDB 学习PPT

    MongoDB的高可用性体现在其复制集(replica sets)功能上,它可以在多个节点间复制数据,确保即使在单个节点故障时也能提供服务。此外,MongoDB的分片(sharding)特性允许将数据分布到多个服务器,以实现水平扩展,...

    MongoDB基础学习资料

    MongoDB,基础,学习,资料 MongoDB,基础,学习,资料

    mongodb学习手册

    MongoDB 是一个流行的开源、分布式文档数据库系统,它在NoSQL数据库领域中占据了重要的位置。作为一款非关系型数据库,MongoDB以JSON格式的文档存储数据,提供了灵活的数据模型和高性能的数据处理能力,尤其适用于大...

    MongoDB学习视频.zip

    在学习MongoDB的过程中,你将了解到集合、文档、数据库的概念,以及如何利用命令行或者可视化工具进行数据交互。此外,你还会接触到复制集、分片、索引、聚合框架等进阶主题,这些都对理解MongoDB如何支持大规模数据...

    mongoDB的官方中文文档

    在学习过程中,通过阅读中文文档和运行示例,可以加深对MongoDB的理解,掌握其基本操作和高级特性。对于初学者,建议从安装开始,逐步学习数据插入、查询、更新和删除,然后探索索引、聚合、事务等进阶主题。随着对...

    MongoDB学习笔记思维导图.pdf

    本篇学习笔记将从基础操作到高级功能,详细阐述MongoDB的关键知识点。 首先,MongoDB的基本单元是集合(collection),类似于关系型数据库中的表,而集合中的元素称为文档(document),文档是键值对的集合,类似于...

    MongoDB 3.6 中文文档

    MongoDB 3.6 中文文档

    基于c#的Mongodb帮助类源码 含一个分页效率测试

    MongoDB 是一个流行的开源、高性能、无模式的文档型数据库,常用于构建现代Web应用程序。在C#开发环境中,MongoDB 提供了丰富的驱动程序,使得...通过深入学习和实践,你可以更好地掌握MongoDB在C#应用中的使用技巧。

    spring mongodb 中文文档

    通过学习这篇文档,开发者可以熟练掌握Spring Data MongoDB 的各种特性,从而更高效地在Java 应用中利用MongoDB 的强大功能。无论是简单的数据操作还是复杂的查询,Spring Data MongoDB 都能提供简洁、强大的解决...

    mongodb学习笔记和mongodb权威指南

    这份压缩包文件包含了关于MongoDB的全面学习资源,包括与Python集成的实践、权威指南、学习手册以及综合总结,旨在帮助用户深入理解和掌握这个数据库系统。 首先,`mongodb_and_python`学习笔记可能涵盖了如何使用...

    mongodb帮助文档整合

    mongodb分片配置.docx Mongodb.chm mongodb安装以及基本操作.docx MongoDB使用手册.doc mongo分布式研究.docx 有这5个文档足够学习Mongodb使用了

    mongodb 手册,帮助文件。

    ### MongoDB 手册知识点概述 ...以上是 MongoDB 手册中涵盖的主要知识点,涵盖了从安装、配置、管理、监控、备份到安全等各个方面,对于希望深入了解 MongoDB 的用户来说是非常有价值的参考资料。

    MongoDB学习笔记

    自己在学习MongoDB的一些笔记,里面有各个查询选择器的使用截图,还有一些索引的介绍。

Global site tag (gtag.js) - Google Analytics