自己管理型配置でスキャンされたテキストインデックスのエントリ数の制限
大規模なデータセットでテキスト検索クエリを実行すると、単一フィールドのテキスト インデックスが多数のエントリをスキャンして結果を返す可能性があり、クエリが遅くなる可能性があります。
クエリのパフォーマンスを向上させるには、 複合テキスト インデックスを作成し、テキスト検索クエリに等価一致を含めることができます。 複合インデックス に等価一致で使用される フィールドが含まれている場合、インデックスはスキャンするエントリが少なくなり、結果がより速く返されます。
このタスクについて
この例では、店舗マネージャーは、次のドキュメントを含む inventory
コレクションをクエリします。
db.inventory.insertMany( [ { _id: 1, department: "tech", description: "lime green computer" }, { _id: 2, department: "tech", description: "wireless red mouse" }, { _id: 3, department: "kitchen", description: "green placemat" }, { _id: 4, department: "kitchen", description: "red peeler" }, { _id: 5, department: "food", description: "green apple" }, { _id: 6, department: "food", description: "red potato" } ] )
マネージャーは、特定の部門内のアイテムのテキスト検索クエリを実行します。
フィールドと フィールドに複合テキスト インデックスを設定すると、スキャンされるインデックスdepartment
description
キーが指定されたdepartment
内のドキュメントのみに制限されます。複合テキスト インデックスは、 description
フィールドの単一フィールド テキスト インデックスと比較してパフォーマンスが向上します。
手順
次のフィールドを含む複合インデックスをinventory
コレクションに作成します。
department
フィールドの昇順または降順のインデックス キーdescription
フィールドのtext
インデックス キー
db.inventory.createIndex( { department: 1, description: "text" } )
結果
複合インデックスの作成後、テキスト検索クエリは、 department
フィールドの指定された等価条件に一致するドキュメントのみをスキャンします。
たとえば、次のクエリは、 department
がkitchen
に等しく、 description
フィールドに string green
が含まれるドキュメントをスキャンします。
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )
出力:
[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]
検査されたドキュメント数の表示
クエリを返すまでにスキャンされたドキュメント数を確認するには、クエリのexecutionStats
を表示します。
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } ).explain("executionStats")
検査されたインデックスキーの数はtotalKeysExamined
フィールドに表示されます。 より多くのインデックス キーを調べるクエリは、通常完了までの時間がかかります。
department
とdescription
の複合インデックスでは、クエリは1 つのインデックスキーのみを検索します。 コレクションには、 department
がkitchen
で、 description
に string green
が含まれているドキュメントが 1 つだけあります。
ただし、クエリがdescription
フィールドのみで単一フィールド テキスト インデックスを使用する場合、クエリは3 つのインデックス キーを検索します。 コレクションには 3 つのドキュメントがあり、 description
フィールドに string green
が含まれています。
前の例で使用されているような小規模なコレクションでは、単一フィールド インデックスと複合テキスト インデックスのパフォーマンスに大きな違いはありません。 ただし、大規模なコレクションでは、インデックス エントリスキャンが増加するとパフォーマンスが著しく低下する可能性があります。 最高のパフォーマンスを得るには、等価一致に最適化するためにスキャンされたインデックスエントリ数を制限したテキストインデックスを作成します。