我正在尝试 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 的最佳插入案例更快!