7

我正在尝试 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 select without index 的性能?

我的代码如下:

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 倍。

后来我并行做了insert程序(8线程8核电脑),对于MongoDB ACKNOWLEDGED模式,insert也提升了3倍,对于它的UNACKNOWLEDGED模式,速度其实慢了50%。

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

4

1 回答 1

3

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

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

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

于 2013-06-27T11:43:02.983 回答