-1

私の mongodb には現在 105,000 のドキュメントがロードされていますが、さらに 500,000 のドキュメントを挿入する必要があり、参照のクエリのために 1000 のドキュメントを挿入するだけで 4 時間以上かかります。

DocA を挿入すると、DocA には多くの引用があります (約 30) DocA によって引用されているドキュメントをデータベースで検索します。[ie: findBy-Doi-Or-Pmid-Or-Pmc(...)]

-そのため、DocA の引用のクエリごとに、完了するまでに約 400 ミリ秒かかります。

以下はプロファイルの 1 つです: Query { $or [ {$or [ {doi: ""}, {pmid: "10508155"} ] }, {pmc: "" } ]}

{
   "ts": ISODate("2012-12-22T11: 55: 39.796Z"),
   "op": "query",
   "ns": "fyparticles.mArticle",
   "query": {
     "$or": {
       "0": {
         "$or": {
           "0": {
             "doi": "" 
          },
           "1": {
             "pmid": "10508155" 
          } 
        } 
      },
       "1": {
         "pmc": "" 
      } 
    } 
  },
   "ntoreturn": NumberInt(1),
   "nscanned": NumberInt(105707),
   "responseLength": NumberInt(20),
   "millis": NumberInt(477),
   "client": "192.168.0.15",
   "user": "" 
}

そして、私が作成したインデックス:

{
   "v": NumberInt(1),
   "key": {
     "doi": NumberInt(1),
     "pmid": NumberInt(1),
     "pmc": NumberInt(1) 
  },
   "ns": "fyparticles.system.indexes",
   "background": NumberInt(1),
   "name": "params" 
}

ここで私を助けてください!私は何かを見逃していますか、何か間違っていますか?

4

1 に答える 1

2

まず、$or複数のクエリを実行してから重複をマージして結果を返す必要があるため、それ自体は世界で最速の演算子ではないを使用しています。

次に$or、1つのインデックスでを使用しています。an$orは基本的に1つ以上のクエリであるため、各句にある一意のフィールドをカバーするために1つ以上のインデックスが必要になる場合があります。

3番目にネストされたsを使用している場合、ネストされたsはインデックスを使用しないこと$orに注意してください: https ://jira.mongodb.org/browse/SERVER-3327$or

したがって、クエリで3つ以上のパフォーマンスの問題が発生しています。

まず、ネストされたものを取り出し$orます。

 { $or: [  {doi: ""}, {pmid: "10508155"}, {pmc: ""} ] }

そして、おそらくこれに3つのインデックスを作成する必要があります(私がテストしていないすべてに適合するように1つを取得できる可能性があります)。

db.col.ensureIndex({ doi: 1 });
db.col.ensureIndex({ pmdi: 1 });
db.col.ensureIndex({ pmc: 1 });

これは、クエリを高速化するための最初の場所です。

于 2012-12-22T13:08:57.837 に答える