没有索引的MongoDB搜索真的很慢吗?

Ye *_*ang 5 mongodb mongodb-java mongodb-query

我正在尝试MongoDB的性能来比较我当前基于MySQL的解决方案。

在具有三个属性A,B和C的集合/表X中,我在MongoDB和MySQL中都为属性A编制了索引。

现在,我在MongoDB和MySQL中投入了1M数据,并在这种简单的情况下尝试了搜索性能。

MongoDB上的插入速度仅比插入MySQL快10%。但这没关系,我知道采用MongoDB不会带来我的CRUD的神奇提升,但是我真的对在没有索引的MongoDB中进行搜索感到惊讶。

结果表明,MongoDB在非索引字段上的选择比在索引字段上的选择慢十倍。

另一方面,非索引字段上的MySQL选择(MyISAM)仅比索引字段上的选择慢70%。

最后但并非最不重要的一点是,在选择索引方案中,MongoDB比我的MySQL解决方案快30%。

我想知道,上述数字正常吗?特别是MongoDB的性能选择没有索引?

我的代码如下:

BasicDBObject query = new BasicDBObject("A", value_of_field_A);
DBCursor cursor = currentCollection.find(query);
while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    // do nothing after that, only for testing purpose
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,从业务逻辑的角度来看,我的收藏可能真的很大(TB甚至更多),您对每个物理收藏的大小有何建议?1000万个文档还是10亿个文档?

非常感谢!

------------------------------编辑------------------- -----------

我在MongoDB和MySQL上都尝试了1000万条记录的插入,而MongoDB的行为比MySQL快20%-确实不如我想的那样。

我很好奇,如果我设置了MongoDB自动分片,是否会提高插入速度?如果是这样,我是否需要将碎片放在不同的物理机器上,或者可以将它们放在具有多核的同一台机器上?

------------------------------更新------------------- -----------

首先,我将MongoDB的写关注从ACKNOWLEDGED修改为UNACKNOWLEDGED,然后MongoDB的插入速度提高了3倍。

后来,我并行制作了插入程序(使用8核计算机的8线程),对于MongoDB ACKNOWLEDGED模式,插入也进行了3倍的改进,对于UNACKNOWLEDGED模式,速度实际上降低了50%。

对于MySQL,并行插入模式将速度提高了5倍!这比MongoDB最好的插入盒快!

Abh*_*mar 4

没有索引的MongoDB查询将进行表扫描,我们应该知道MongoDB的数据大小与MySQL相比要大得多。我猜这可能是进行全面扫描时速度缓慢的问题之一。

关于使用索引的查询,由于缓存、没有复杂的查询优化器计划(如mysql)等,mongoDB 可能会更快。

集合的大小不是问题。事实上,在一个集合中可以轻松处理 1000 万个。如果您需要归档数据,那么您可以分成较小的集合,这将使过程变得容易。