我在mongodb数据库插入了155万条wiki
维基百科
的数据占用了大概11G的内存空间
当我查询的是数据库前几个文档的时候花费时间不到1ms,
当我查询数据库里第150万条数据的时候平均花费了63800ms
当我查询数据库里第150万条数据的时候平均花费了20ms
通过测试我发现建立索引之后使用skip、limiit翻页的时间还是没有减少,很慢翻到第150条数据的时候花了大概1分钟。
优化的方法就是在find的时候对已经建立索引的数据进行排序,例如:
JavaScript Code
JavaScript Code
我首先在未建索引的时候进行普通的查询:
然后我对查询的字段建立索引 db.wikiPage.ensureIndex({title:1}):
1
2 3 4 5 |
console.time('计时器3'); wikiProvider.find({},{limit:1,skip:1500000,sort:[['title',1]]}, }); |
测试mapReduce的性能的时候,我统计了下title的个数花了
110220ms
然后我又结合query和sort统计了一下title中含有'economy'的花了3461ms,
1
|
wikiProvider.mapReduce(map, |
统计出165个title中含有这个字符串,因此如果优化mapReduce就需要使用好query和sort了
当数据库里的文档达到1300万条,约40G。
使用skip、limit翻页到第1276万条数据时花费了348354ms
使用sort之后再用skip、limit翻页到第1276万条数据时花费了4014ms
mapReduce统计title的个数花了
366296ms
然后我又结合query和sort统计了一下title中含有'economy'的花了57224ms
统计出
898
个
title
中含有这个字符串
同时通过其他测试我也总结出一个结论:你在使用mapReduce之前可以估算下统计出的结果占整个数据库collection数量的比例大小,如果基本占的比例很高的话就没必要使用query、sort了,因为这种情况query根本没起到过滤的作用,直接在map函数里写过滤条件就可以了;query时使用正则表达式也是很废时间的。