在听到了有关MongoDB性能的许多好处之后,我们决定尝试Mongodb解决我们遇到的问题。首先,将几个mysql数据库中的所有记录移至mongodb中的单个集合。这样就产生了一个的集合,其中有2900万个文档(每个文件至少有20个字段),在HD中占用了约100 GB的空间。我们决定将它们全部放在一个集合中,因为所有文档都具有相同的结构,并且我们要查询和汇总所有这些文档的结果。

我创建了一些索引来匹配我的查询,否则即使是简单的count()也会花费很多时间。但是,诸如distinct()和group()之类的查询仍然花费太长时间。

例:

// creation of a compound index
db.collection.ensureIndex({'metadata.system':1, 'metadata.company':1})

// query to get all the combinations companies and systems
db.collection.group({key: { 'metadata.system':true, 'metadata.company':true }, reduce: function(obj,prev) {}, initial: {} });

我看了一下mongod日志,它有很多这样的行(在执行上面的查询时):
Thu Apr  8 14:40:05 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1048890 nreturned:417 154ms
Thu Apr  8 14:40:08 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1050205 nreturned:414 430ms
Thu Apr  8 14:40:18 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1049748 nreturned:201 130ms
Thu Apr  8 14:40:27 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1051925 nreturned:221 118ms
Thu Apr  8 14:40:30 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1053096 nreturned:250 164ms
...
Thu Apr  8 15:04:18 query database.$cmd ntoreturn:1 command  reslen:4130 1475894ms

该查询花费了1475894ms,这比我期望的要长得多(结果列表有大约60个条目)。首先,鉴于我的收藏中有大量文件,这是否可以预期?一般而言,聚合查询在mongodb中是否会如此缓慢?关于如何提高性能的任何想法?

我在具有双核和10GB内存的单台计算机上运行mongod。

谢谢。

最佳答案

这个想法是通过在分布在多台计算机上的分片数据库上使用MapReduce来提高聚合查询的性能。

我使用同一台计算机上的Oracle中的按组选择语句对Mongo的Mapreduce的性能进行了一些比较。我确实发现Mongo慢了大约25倍。这意味着我必须在至少25台计算机上分片数据,才能获得与Oracle在单台计算机上提供的性能相同的Mongo性能。我使用了一个约有1400万个文档/行的集合/表格。

通过mongoexport.exe从mongo导出数据,并将导出的数据用作Oracle中的外部表并在Oracle中进行分组,比使用Mongo自己的MapReduce快得多。

关于performance - MongoDB在聚合查询上的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2599943/

10-12 22:30
查看更多