我正在尝试MongoDB的性能来比较我当前基于MySQL的解决方案。
在具有三个属性A,B和C的集合/表X中,我在MongoDB和MySQL中都有索引属性。
现在我在MongoDB和MySQL中抛出1M数据,并在这个直接场景中尝试搜索性能。
MongoDB上的插入速度比插入MySQL的速度快10%。但是没关系,我知道采用MongoDB不会带来我的CRUD的神奇推广,但我对MongoDB中没有索引的搜索感到非常惊讶。
结果显示,非索引字段上的MongoDB选择比索引字段上的选择慢十倍。
另一方面,非索引字段上的MySQL选择(MyISAM)仅比索引字段上的选择慢约70%。
最后但并非最不重要的是,在select with index场景中,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
}
顺便说一句,从商业逻辑的角度来看,我的收藏可能非常庞大(TB等等),你对每个实体收藏的大小有什么建议? 1000万份文件或10亿份文件?
非常感谢!
------------------------------编辑---------------- --------------
我在MongoDB和MySQL上尝试了1000万条记录的插入,MongoDB的行为比MySQL快了大约20% - 并不像我想的那么多。
我很好奇,如果我设置了MongoDB自动分片,是否会提升插入速度?如果是这样,我是否需要将Shards放在不同的物理机器上,或者我可以将它们放在具有多核的同一台机器上?
------------------------------更新---------------- --------------
首先,我将MongoDB写入问题从ACKNOWLEDGED修改为UNACKNOWLEDGED,然后MongoDB插入速度快3倍。
后来,我并行编写了插入程序(8个线程与8核计算机),对于MongoDB ACKNOWLEDGED模式,插入也提高了3倍,对于其UNACKNOWLEDGED模式,速度实际上慢了50%。
对于MySQL,并行插入模式可以将速度提高5倍!这比MongoDB的最佳插入案例更快!
答案 0 :(得分:3)
没有索引的MongoDB查询将进行表扫描,我们应该知道mongodb的数据大小与mysql相比要多得多。我猜这可能是进行全面扫描时缓慢的问题之一。
关于带索引的查询,mongoDB由于缓存可能会更快,没有复杂的查询优化器计划(如mysql)等。
集合的大小不是问题。事实上,在一个集合中可以轻松处理1000万个。如果您需要归档数据,那么您可以分成较小的集合,这将使该过程变得容易。