2

私は非常に普通の MongoDB クエリを実行していますが、特に複雑なことや特別なことは何もありません。所要時間 (> 1 秒) が正常なのか、それともインデックスに問題があるのか​​疑問に思っています。

この特定のクエリのインデックスを提供し、explain()それが使用されていることも伝えましたが、毎回コレクションのフル スキャンが行われ、Web ページ全体が 1 秒以上遅くなります。

クエリ:

db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"})

説明:

> db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"}).explain()
{
    "cursor" : "BtreeCursor art_filter_1_art_hauptartikelnr_1",
    "nscanned" : 21306,
    "nscannedObjects" : 21306,
    "n" : 21306,
    "millis" : 1180,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "art_filter" : [
            [
                null,
                null
            ]
        ],
        "art_hauptartikelnr" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
}

インデックス:

{
   "v": 1,
   "key": {
     "art_filter": 1,
     "art_hauptartikelnr": 1 
  },
   "ns": "togshop.tog_artikel",
   "background": true,
   "name": "art_filter_1_art_hauptartikelnr_1" 
}

コレクション全体が毎回スキャンされるのはなぜですか? false の理由とisMultiKey、このクエリ/インデックスを最適化するにはどうすればよいですか?

環境はスタンドアロン サーバー、MongoDB 2.0.1、64 ビット Linux、php-mongo 1.2.6 を使用して PHP からアクセス

4

1 に答える 1

7

コレクション全体が毎回スキャンされるのはなぜですか?

そうではない。インデックスを通過しています:

"cursor" : "BtreeCursor art_filter_1_art_hauptartikelnr_1",

これは、インデックス「art_filter_1_art_hauptartikelnr_1」が $exists 条件を満たすために使用されることを意味します。

そのフィルターがあまり選択的でない場合 (つまり、フィルターを満たすレコードが多数ある場合)、クエリにはまだ多くの時間がかかります。

isMultiKey が false である理由

マルチキー インデックスが使用されていないため、false です。マルチキー インデックスは、配列を持つフィールドを値として含むインデックスです。複合インデックス (つまり、複数のフィールドを持つ) とは関係ありません。

 $where":"this._id == this.art_hauptartikelnr"

2 番目の条件は Javascript 式であり、ここではインデックスを使用できません (クエリ アナライザーがユーザーの操作を理解できないため)。あったとしても、_id を含むインデックスが必要です。

このクエリ/インデックスを最適化するにはどうすればよいですか?

データを非正規化して、値が true または false の新しいフィールド「idIsHauptArtikelNr」を作成します。(art_filter, idIsHauptArtikelNr) にインデックスを作成し、クエリを次のように置き換えます

  { art_filter :{ $exists :false}, idIsHauptArtikelNr : true }
于 2012-04-11T12:34:00.447 に答える