当前访客身份:游客 [ 登录 | 加入开源中国 ]

讨论区

当前位置:
讨论区 » 技术问答 » MongoDB

11月23日开源中国源创会年度(北京万豪酒店)千人盛典正在报名中

最近玩MongoDB的时候发现一个问题,查询速度比较慢。客户端是用java测试的,官方下载驱动和2.3和2.4都试过,主要代码如下:

cur = dbc.find(query).limit(limit);//代码1

while(cur.hasNext()) {//代码2

……

}

发现代码1执行很快,代码2占用很多时间,返回100条数据经常要10秒以上,数据量大的更久。同一个查询第二次以后又会很快,这应该是数据库把活跃的数据放在内存的原因。但是我在控制台(启动mongo)上执行查询却很快返回结果,没有出现过等待很久的情况。不知道大家有没有遇到类似情况,有没有好的优化方法?

我的服务器配置

CPU 4核 2.33G * 2

内存:2G

硬盘:15000RPM  300G

操作系统:Fedora 14 64位

MongDB中数据大约4KW条,数据文件20G,索引文件3G

会不会是服务器内存小了?但在控制台执行查询效果却很好,疑惑!!!

kevin2010 kevin2010
发帖于 4 年 前
24回/4179阅

按票数排序  显示最新答案   共有24个答案 (最后回答: 4 年 前)

    1
  • LinkerLin

    mongodb不是设计用来遍历的.

    遍历自然是很慢.

    你可以用 JS 写写存储过程来提速. http://www.mongodb.org/display/DOCS/Server-side+Code+Execution

    http://www.mongodb.org/display/DOCS/MapReduce

  • 1
  • kevin2010

    调用Server Side JS,没找到例子,自己摸索出来的,供参考

            //insertList是存储在db.system.js中的函数,接受一个数组参数
            String proc="function(list){ return insertList(list);}";
           
            //Java 的List可以对应到JS的数组
            List<DBObject> list = new ArrayList<DBObject>();
            list.add(...);
            ...
       
            try {
                CommandResult cr = client.getDB().doEval(proc, list);
                log.info("result:"+cr.toString());
            } catch (MongoException e) {
                e.printStackTrace();
                return false;
            }

  • 1
  • disabled

    很大可能还是因为Mongo索引没加,我用的这么多案例中基本上都是忘记了索引慢,加上对应的索引,千万级的数据都在毫秒级的相应时间

    Bye the bye, 我用的pymongo驱动,python环境

  • 0
  • defier

    我也是。查询速度很慢

  • 0
  • WangWupeng

    遇到同样的问题

    我理解,java客户端只是查到一个游标,后面遍历的时候每次都要重新去mongodb查询

    用toarray方法可以一次取出整个结果集,不过貌似效率也很差

  • 0
  • LinkerLin

    mongodb不是这么个用法.

  • 0
  • kevin2010

    楼上貌似是高人,怎么用?请赐教!

  • 0
  • kevin2010

    谢谢楼上指点!

    还有个问题请教:

    MongoDB在可用磁盘空间小于数据文件大小的时候无法执行repairDatabase(),删除数据数据不释放空间,数据文件越来越大,有什么方法解决这个问题?

  • 0
  • LinkerLin

    买更大的硬盘.

  • 0
  • kevin2010

    这个我也知道,没有更好的方法?



回答案顶部 | 回页面顶部
有什么技术问题吗? 我要提问