25
回答
MongoDB客户端Java查询问题?
破译“粽”子代码,拿最高悬赏!>>>   

最近玩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
发帖于6年前 25回/4K+阅
共有25个答案 最后回答: 5个月前

调用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;
        }

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

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

遇到同样的问题

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

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

谢谢楼上指点!

还有个问题请教:

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

顶部