Heim > Fragen und Antworten > Hauptteil
我在项目中遇到一个MongoDB的问题,好多天了还是没能得到解决,希望得到大牛的指点。
具体问题是:长时间不访问数据库的情况下,第一次查询数据库所需的时间很长,但是之后的查询就会很快。
具体情况:
1 2 3 4 5 6 |
|
目前考虑的原因:
1 |
|
需要得到的帮助:
1 2 3 4 5 |
|
phpcn_u15822017-05-02 09:28:08
您说的这个问题是和working set相关联。
1、什么是working set?
MongoDB的内存管理中一个重要的概念。在内存管理中尽量将业务经常访问的数据集和相关的索引放置在内存中。
2、怎么将working set放置在内存中呢?
在您的表述中,其实是一个需要将working set提前预热放置在内存中(Preload or Preheating)。具体怎么做?您提到了touch(MMAP引擎),那么在后续的版本(WT引擎)中如何实现呢?
如果是关系型数据库,经常会用到的办法是select *,很多时候做性能测试,为达到好的效果,都会事先运行一批次Select语句预热内存。
在MongoDB中,可以考虑:
1)如果业务查询中可以直接使用到covered index来查询的,或者说需要预热index的时候:
db.collection.find({}, {"_id" : 0, "field_a" : 1, "field_b" : 1}).hint({"field_a" : 1, "field_b" : 1}).explain()
2)当需要预热working set时,前提是您知道你的collection中哪些数据是经常需要被访问的,通常是某个时间段,然后将这个时间段的collection,使用上面相同的方法来预热。
不同之处是:预热index是将这个index都预热了,所以查询条件是{},鹅而,预热working set,只是预热collection中某一部分数据,所以这个查询条件可能是和时间范围相关的条件。
供参考。
Love MongoDB!Have fun!
MongoDB中文社区深圳用户大会
这个周六,大家约起
详情请入