2016-06-14 15 views
1

私はmongoDBを使用してポリゴンのコレクションを保存し、$geoIntersectsクエリを使用して、特定のポイントがどのポリゴンであるかを調べます。MongoDBキャッシュのメモリ内のコレクション?

var LocationShema = mongoose.Schema({ 
    name: String, 
    geo: { 
     type: { 
      type: String 
     }, 
     coordinates: [] 
    } 
}); 

LocationShema.index({geo: '2dsphere'}); 

module.exports = mongoose.model('Location', LocationShema); 

ので、各要素は多角形である:

mongooseSchemaは、このようになります。私は2dsphereインデックスを追加して、クエリが高速になり、コレクション全体がメモリに格納されることを期待しました。残念なことに、〜20queriesのために約600msが必要です。

私のクエリは次のようになります。

Location.find({ 
      geo: { 
       $geoIntersects: { 
        $geometry: { 
         type: 'Point', 
         coordinates: [pos.lng, pos.lat] 
        } 
       } 
      } 
},...) 

がありますとにかく、私はより速く、この実行を行うことができますか? MongoDBにデータベース内のコレクション全体を強制的にキャッシュさせることができます(コレクションは決して変更されないので)。可能な方法はありますかコレクションが実際にインメモリキャッシュに格納されているかどうかを確認します

また、地理空間検索を高速にするために使用できる代替手段はありますか(ライブラリなど)?

+1

クエリの 'explain()'を投稿できますか? – KRONWALLED

+0

mongoシェルでクエリを実行すると 'db.collectionName.find(query).explain()' – profesor79

+0

が使用されますが、mongooseを使用していますが、シェルを使用していません。 – Cristy

答えて

1

mongo> 3.0では、inMemoryストレージを使用できます。つまり、シードされたコレクションがメモリに残っていると(すべての変更が維持されない)mongoのインスタンスを持つことができます。

コレクションが静的な場合は、Redisのようなキャッシュストレージや、クエリと応答を格納したTTLインデックスコレクションを実装する方法があります。

シードのプロセスは、現在のコレクションのバックアップとメモリコレクションのリストアによって実行できます。

mongoが他のコレクションをロードする必要がある場合(ビジー状態のシステムの場合)、頻繁にクエリを実行するときに、メモリ内に残渣があります。

すべての歓迎!

+0

このコレクションのためだけに 'inMemory'ストレージを使用できますか?コレクションを「シード」するにはどうすればいいですか? – Cristy

+1

関連するディスクブロックがOSのディスクバッファに存在すると、クエリを実行した後で(十分なメモリがある場合) – robertklep

+0

@robertklep pls編集を参照してください – profesor79

関連する問題