インデックスはどんなデータベースでも非常に重要ですが、MongoDB でもそれは同じことです。 インデックスを使うことで、MongoDB でのクエリーの実行はより効率的になります。
インデックスがない状態で、何千ものドキュメントがあるコレクションを持っていて、あるドキュメントを見つけるためにクエリを実行すると、その場合、MongoDB はドキュメントを見つけるためにコレクション全体をスキャンする必要があります。 しかし、インデックスがあれば、MongoDB はこれらのインデックスを使用して、コレクション内で検索しなければならないドキュメントの数を制限します。
インデックスは、コレクションのデータの一部分を保存する特別なデータセットです。 データが部分的であるため、このデータを読み取ることが容易になる。 この部分セットは、特定のフィールドの値、またはフィールドの値で並べられたフィールドのセットを格納します。
このチュートリアルでは、以下を学習します。
- インデックスの影響を理解する
- インデックスを作成する方法: createIndex()
- インデックスを検索する方法: getindexes()
- インデックスを削除する方法。 dropindex()
Understanding Impact of Indexes
さて、序章からインデックスがクエリに有効であることがわかりましたが、インデックスが多すぎると、Insert、Delete、Update操作など他の操作が遅くなることがあります。
ドキュメントに対して頻繁に挿入、削除、および更新操作が実行される場合、インデックスをそれだけ頻繁に変更する必要があり、それはコレクションのオーバーヘッドになるだけでしょう。
以下の例は、どのようなフィールド値がコレクション内のインデックスを構成できるかの例を示しています。 インデックスは、コレクション内の 1 つのフィールドにのみ基づくことも、コレクション内の複数のフィールドに基づくことも可能です。
以下の例では、Employeeid “1” と EmployeeCode “AA” が、コレクション内のドキュメントのインデックスに使用されています。 そのため、クエリ検索が行われると、これらのインデックスが使用されて、コレクション内の必要なドキュメントが迅速かつ効率的に検索される。
そのため、検索クエリが EmployeeCode “AA” に基づいている場合でも、そのドキュメントが返されることになります。
インデックスの作成方法: createIndex()
MongoDB のインデックス作成は “createIndex” メソッドを使用します。
次の例では、コレクションにインデックスを追加する方法を示します。 Employeeid” と “EmployeeName” というフィールド名を持つ Employee コレクションがあると仮定します。
db.Employee.createIndex({Employeeid:1})
コードの説明です。
- createIndexメソッドは、ドキュメントの “Employeeid “に基づいてインデックスを作成するために使用します。
- パラメータ’1’は、”Employeeid” Field値でインデックスを作成するときに昇順に並べる必要があることを示します。 これは、MongoDB がコレクションに自動的に作成する _id フィールド (id フィールドは、コレクション内の各ドキュメントを一意に識別するために使用されます) とは異なることに注意してください。 これで、ドキュメントは _id フィールドではなく Employeeid に従ってソートされます。
コマンドが正常に実行されると、次のような出力が表示されます。
出力されます。
- numIndexesBefore: 1 は、コマンド実行前にインデックスに存在したフィールド値 (コレクション内の実際のフィールド) の数を示しています。 各コレクションには _id フィールドがあり、これもインデックスのフィールド値としてカウントされることを覚えておいてください。 コレクションが最初に作成されたとき、_id インデックス フィールドはコレクションの一部なので、numIndexesBefore の値は 1.
- numIndexesAfter: 2は、コマンド実行後にインデックスに存在したField値の数を示します。
- ここで、”ok: 1」出力は、操作が成功し、新しいインデックスがコレクションに追加されたことを指定します。
上記のコードは、1つのフィールド値に基づいてインデックスを作成する方法を示していますが、複数のフィールド値に基づいてインデックスを作成することも可能です。
db.Employee.createIndex({Employeeid:1, EmployeeName:1])
コードの説明です。
- createIndex メソッドは、複数の Field 値を考慮するようになり、インデックスが “Employeeid” および “EmployeeName” に基づいて作成されるようになりました。 Employeeid:1 および EmployeeName:1 は、インデックスがこれら 2 つのフィールド値に基づいて作成されることを示し、:1 は昇順であることを示します。
インデックスの見つけ方: getindexes()
MongoDB でインデックスを見つけるには “getIndexes” メソッドを使用します。
次の例は、これをどのように行うかを示しています。
db.Employee.getIndexes()
コードの説明です。
- getIndexesメソッドは、コレクション内のすべてのインデックスを見つけるために使用されます。
コマンドが正常に実行された場合、次のOutputが表示されます。
出力されます。
- 出力は、_id フィールドと Employee id フィールドであるコレクションに 2 つのインデックスがあることを示すだけのドキュメントを返します。 1 は、インデックスのフィールド値が昇順で作成されることを示します。
How to Drop Indexes: dropindex()
MongoDB のインデックスの削除は dropIndex メソッドを使用します。
次の例は、これをどのように行うかを示しています。
db.Employee.dropIndex(Employeeid:1)
コードの説明です。
- dropIndex メソッドは、インデックスから削除する必要がある必要なフィールド値を取ります。
コマンドが正常に実行された場合、次のような出力が表示されます。
Output:
- nIndexesWas:3は、コマンド実行前にインデックスに存在したフィールド値の数を示しています。 各コレクションには_idフィールドがあり、これもインデックスのField値としてカウントされることを覚えておいてください。 1出力は、操作が成功したことを指定し、「Employeeid」フィールドはインデックスから削除されます。
コレクション内のすべてのインデックスを一度に削除するには、dropIndexesコマンドを使用できます。
次の例では、これをどのように実行できるかを示しています。
db.Employee.dropIndex()
コードの説明です。
- dropIndexes メソッドは、_id インデックス以外のすべてのインデックスを削除します。
コマンドが正常に実行された場合、次のOutputが表示されます。
Output:
- nIndexesWas:2は、コマンド実行前にインデックスに存在したField値の数を示しています。
- 各コレクションには、インデックスのフィールド値としてカウントされる _id フィールドがあり、これは MongoDB によって削除されないので、このメッセージはそれを示していることを再度覚えておいてください。 1 の出力は、操作が成功したことを指定します。
まとめ
- インデックスを定義することは、コレクション内のドキュメントをより速く、効率的に検索するために重要です。 インデックスは1つのフィールドまたは複数のフィールド値で作成できます。
- インデックスはgetIndexesメソッドを使用して見つけることができます。
- インデックスは、単一のインデックスのためのdropIndexまたはすべてのインデックスを削除するにはdropIndexesを使用して削除することができます。