2017-01-17 11 views
1

を使用していない私は、コレクション内の次のインデックスを持っています。でも、単純なクエリがインデックスを利用していない、しかし、複合インデックスに対して実行されているいくつかの実行速度の遅いクエリをうまくしようとモンゴはインデックス

db.JobStatusModel.getIndexes() 
[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "name" : "_id_", 
     "ns" : "jobs.JobStatusModel" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "peopleId" : 1, 
      "jobId" : 1 
     }, 
     "name" : "peopleId_jobId_compounded", 
     "ns" : "jobs.JobStatusModel" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "jobId" : 1 
     }, 
     "name" : "jobId_1", 
     "ns" : "jobs.JobStatusModel", 
     "background" : true 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "peopleId" : 1, 
      "disInterested" : 1 
     }, 
     "name" : "peopleId_1_disInterested_1", 
     "ns" : "jobs.JobStatusModel", 
     "background" : true 
    } 
] 

db.JobStatusModel.find({ jobId : '1f940601ff7385931ec04dca88c853dd' }).explain(true) 
{ 
    "cursor" : "BtreeCursor jobId_1", 
    "isMultiKey" : false, 
    "n" : 221, 
    "nscannedObjects" : 221, 
    "nscanned" : 221, 
    "nscannedObjectsAllPlans" : 221, 
    "nscannedAllPlans" : 221, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 1, 
    "nChunkSkips" : 0, 
    "millis" : 1, 
    "indexBounds" : { 
     "jobId" : [ 
      [ 
       "1f940601ff7385931ec04dca88c853dd", 
       "1f940601ff7385931ec04dca88c853dd" 
      ] 
     ] 
    }, 
    "allPlans" : [ 
     { 
      "cursor" : "BtreeCursor jobId_1", 
      "isMultiKey" : false, 
      "n" : 221, 
      "nscannedObjects" : 221, 
      "nscanned" : 221, 
      "scanAndOrder" : false, 
      "indexOnly" : false, 
      "nChunkSkips" : 0, 
      "indexBounds" : { 
       "jobId" : [ 
        [ 
         "1f940601ff7385931ec04dca88c853dd", 
         "1f940601ff7385931ec04dca88c853dd" 
        ] 
       ] 
      } 
     } 
    ], 
    "server" : "mongo3.pilot.dice.com:27017", 
    "filterSet" : false, 
    "stats" : { 
     "type" : "FETCH", 
     "works" : 222, 
     "yields" : 1, 
     "unyields" : 1, 
     "invalidates" : 0, 
     "advanced" : 221, 
     "needTime" : 0, 
     "needFetch" : 0, 
     "isEOF" : 1, 
     "alreadyHasObj" : 0, 
     "forcedFetches" : 0, 
     "matchTested" : 0, 
     "children" : [ 
      { 
       "type" : "IXSCAN", 
       "works" : 222, 
       "yields" : 1, 
       "unyields" : 1, 
       "invalidates" : 0, 
       "advanced" : 221, 
       "needTime" : 0, 
       "needFetch" : 0, 
       "isEOF" : 1, 
       "keyPattern" : "{ jobId: 1.0 }", 
       "isMultiKey" : 0, 
       "boundsVerbose" : "field #0['jobId']: [\"1f940601ff7385931ec04dca88c853dd\", \"1f940601ff7385931ec04dca88c853dd\"]", 
       "yieldMovedCursor" : 0, 
       "dupsTested" : 0, 
       "dupsDropped" : 0, 
       "seenInvalidated" : 0, 
       "matchTested" : 0, 
       "keysExamined" : 221, 
       "children" : [ ] 
      } 
     ] 
    } 
} 

私たちは、私はそれだけで私のフィールドがインデックス化されている場合でも、索引スキャンを行うことができないという意味出力から"indexOnly" : false,を取得しています出力から見ることができるように。クエリがインデックスに対してのみ実行されていることを確認するにはどうすればよいですか?

答えて

1

、あなたがインデックスからフィールドのみを返す必要がindexOnly入手してくださいprojectionを使用するために:

db.collection.find(<query filter>, <projection>) 

db.JobStatusModel.find({ jobId : '1f940601ff7385931ec04dca88c853dd' }, {jobId:1, _id:0}) 
3

も、単純なクエリがインデックスを利用していません。

は、IXSCANステージとインデックスカーソル("cursor" : "BtreeCursor jobId_1",)のようにインデックスを使用しました。提供getIndexes()出力に基づいしかし、

、複合インデックスに対して実行されているいくつかの実行速度の遅いクエリをうまくしようと

、単一のフィールドjobId上のクエリにのみ考慮すべき一つの候補インデックスがあります。 {jobId:1}。このクエリは1ミリ秒("millis" : 1)で実行され、221個の索引キーを参照して221個の文書が返されました。これは、一致とのキー比較のための理想的な1:1ヒット率です。

{peopleId:1, jobId:1}の複合インデックスは、クエリにpeopleIdという値を指定した場合にのみ考慮されます。ただし、jobIdのみでクエリを行う場合は、逆の順序でこれらのフィールドを使用して複合インデックスを作成することもできますが、peopleIdjobIdの両方で頻繁にクエリする場合もあります。 {jobId:1, peopleId:1}上の複合インデックスは、同じクエリを満たすことができるため、インデックスの必要性を取り除きます。

詳細については、MongoDBマニュアルのCreate Indexes to Support Your Queriesとブログ投稿Optimizing MongoDB Compound Indexesを参照してください。

注:あなたが使用しているMongoDBサーバーのバージョンについては言及していませんが、explain()出力の形式は、廃止に達した古いバージョンのMongoDBを実行していることを示していますJan-2017のようにMongoDB 3.0)。重要な改善点があるので、新しいサポートされているバージョン(MongoDB 3.2や3.4など)にアップグレードすることを強くお勧めします。 EOL(End-of-Life)サーバーリリースシリーズはもはや維持されておらず、今後のプロダクションリリースで対処されている既知のバグや脆弱性にアプリケーションをさらす可能性があります。

私たちは、私はそれだけで私のフィールドがインデックス化されている場合でも、索引スキャンを行うことができないという意味出力から"indexOnly" : false,を取得しています出力から見ることができるように。クエリがインデックスに対してのみ実行されていることを確認するにはどうすればよいですか?

indexOnly値のみcovered queryの特別な場合にtrueあろう。カバーされたクエリーは、クエリー内のすべてのフィールドがインデックスの一部であるものです。結果に投影されるフィールドはすべて同じインデックスにあります。通常、索引付けされた照会は扱われません。索引ルックアップを使用して一致する文書を検索し、照会プロジェクションで要求されたフィールドに検索およびフィルター処理します。