MongoDb Count 对一个超过1000w条的集合按条件统计,求解决方案

oogg 发布于 2013/01/07 17:54
阅读 17K+
收藏 1
MongoDb中使用 Count 对一个超过1000w条数据的集合进行查询(已建立索引)

按指定条件返回包含在集合中的文档总数(需求是 Count中要包含条件,不能直接db.collection.count())

但是整个操作十分慢,甚至造成服务器死机;

MongoDb 在服务器上只存在一个实例,没有进行分布;

执行的脚本如下(集合中value == 0 的文档数大约在3,000,000左右):

dbName: MyDb

CollectionName: MyCollection

CollectionCount: 13,630,100

Shell:
    db.MyCollection.find({"value":0}).count();   

    db.MyCollection.count({"value":0});   

结果: 要等待很漫长的时间才会得到,服务器的内存几乎耗尽;若不包含条件的统计(db.MyCollection.count())则很快

C#>
 //驱动使用Samus 
 using (var mongo = new MongoDbAccess())
            {
                try
                {
                    var collection = mongo.GetCollection("MyCollection");
                    var counts =collection.Linq().Where(w=>w.value ==0).Count();  
                }

               catch (MongoException ex){  //...}

       )

结果: 出现超时,无法通讯,若不包含条件的统计(collection.count())则很快;求解决方案;
加载中
0
d
dbtop
你说有索引,那么索引是什么呢。如果创建的索引。
0
oogg
oogg

@dbtop  在集合中已对查询条件关联到的项都建立了唯一索引,事实上,集合中每一份文档包含了一个属性 Id (Long类型) ,直接执行:

db.MyCollection.find({Id:{$gt:0}}).count()   //查询Id>0的所有文档,这样子查也是极慢的

而在实际应用场景中,我们集合中的文档一般都有分类的,然后按指定分类在1000w个文档中筛选得到该分类包含的总数,如:

db.MyCollection.find({"Type":"type1").count()

这种场景应该也很常见。但这样也很慢. 刚试了下mapReduce,并把mapReduce的结果按需保存以实现上述的应用,但也很慢,不知大家平时是怎么处理的?

这里只是对单个MongoDb实例的检索,没有对所有节点进行归并操作,不然应该会更慢。可能我理解有问题,刚学MongoDb,请大家不吝赐教,谢谢!

0
d
dbtop
据我了解, sql-aggregation的方式要快一些。你可以试试哈。 http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/
思念悲伤
思念悲伤
并不快,看来你并没有实际测试过!
0
d
dbtop

其实吧mongodb不太适合你说的这种场景,我知道的情况一般大家是怎么用这个的呢,就是加一个统计的Collections,每次数据增加时加一,每次数据删除时减一。


这样唯一的问题就是,可能两边数据不一致。


0
oogg
oogg
@ dbtop   好的,我试下,谢谢先哈,~~~
0
oogg
oogg
@dbtop 不过,应该有方法的,再了解下其他的先
0
缪斯的情人
缪斯的情人
肯定不能实时查询,写个js脚本,定期的查询,每次只取一个count数就行
0
oogg
oogg
@ 缪斯的情人   谢谢呃,我再找找看,这种场景是比较暴力,生产环境中没到1000w但这个始终是个瓶颈。或者会有其他的我不知道的方式实现,毕竟MongoDb也有不少大数据方面的应用了,再看下先
0
专业打酱油
专业打酱油
机器什么配置
0
oogg
oogg
@ 专业打酱油   稍微高档点的个人PC(i5 系列,8GB内存)
专业打酱油
专业打酱油
128G,可以玩玩
专业打酱油
专业打酱油
我只能说,这个配置玩mongo就是找死。
返回顶部
顶部