0

サブドキュメントのリストを含むドキュメントがある Spring/Mongo アプリケーションからのクエリ パフォーマンスが低下しています。特定のクエリに役立つように複合インデックスを追加しようとしましたが、サブドキュメントのリスト内を検索するときはあまり役に立たないようです。これは一般的に悪い考えですか (リスト内のサブドキュメントに対してクエリを実行する)、またはこれを改善するためにできることはありますか? mmapv1 から wireTiger ストレージ エンジンにアップグレードしようとしましたが、wiredTiger は実際には同じクエリで ~30% 遅いことがわかりました。

私の理解では、インデックス行の数は、複合インデックスでインデックスを作成しようとする各リストのドキュメント行 * サブドキュメント数になります。最適ではないように思えますが、これを最適化してサブドキュメントをリストに残す方法があるかどうか疑問に思っていました。

Spring Mongo Document クラスの疑似/簡略化された例:

@Document
@CompoundIndexes({
@CompoundIndex(name = "index1", def = "{ 'attr':1, 'things:attr1': 1, 'things:attr2': 1}", unique = false)
})
public class Foo {
  String attr
  List things
}

したがって、MongoDB ドキュメントは次のようになります。

{
attr: value,
things: [
    {
      attr1: value1,
      attr2: value2
    },
    {
      attr1: value1,
      attr2: value2
    }
  ]
}

クエリの例:

{ "$and" : [ {"attr": "value"}, { "things" : { "$elemMatch" : { "attr1" : "value2" , "attr2" : "value2"}}}]}

私の次善の策は、リスト内の各サブドキュメントのドキュメントのルートにフィールドを直接配置することですが、これには、コードベースのリファクタリングが必要になり、その後、ドキュメントは次のようになります。

{
attr: value,
thing1:
    {
      attr1: value1,
      attr2: value2
    },
thing2:
    {
      attr1: value1,
      attr2: value2
    }
  ]
}
4

0 に答える 0