MongoDB インデックス作成: createIndex() および dropIndex()

⚡ スマートサマリー

MongoDB インデックスは、コレクションのフィールドの順序付きサブセットを格納するため、クエリはすべてのレコードをスキャンすることなくドキュメントを検索できます。createIndex、getIndexes、およびdropIndexメソッドは、これらのパフォーマンスに重要な構造を構築、一覧表示、および削除します。

  • 🚀 目的: インデックスは MongoDB 読み取り速度を上げるため、コレクション全体のスキャンをスキップします。
  • 🛠️ createIndex: 単一フィールドまたは複合インデックスを昇順または降順で作成します。
  • 🔍 getIndexes: コレクション上のすべてのインデックス(デフォルトの_idを含む)を一覧表示します。
  • 🗑️ ドロップインデックス: 1つのインデックスを削除します。dropIndexesは_idを除くすべてのインデックスを削除します。
  • <XNUMXxEXNUMX><XNUMXxEXNUMX><XNUMXxXNUMXA><XNUMXxXNUMX><XNUMXxXNUMXA>️️ トレード・オフ: インデックスが多すぎると、挿入、更新、削除の処理速度が低下します。
  • 🤖 AIチューニング: アシスタントが適切なインデックスを自動的に推奨・生成します。

MongoDB インデックス作成、インデックス作成、インデックス削除

何ですか MongoDB インデックス?

インデックスはどのデータベースでも非常に重要です。 MongoDB 違いはありません。インデックスを使用すると、クエリの実行は MongoDB より効率的になります。

インデックスのない数千のドキュメントを含むコレクションがあり、特定のドキュメントを検索するためにクエリを実行する場合、 MongoDB 文書を見つけるにはコレクション全体をスキャンする必要があります。しかし、インデックスがあれば、 MongoDB これらのインデックスを使用して、コレクション内で検索する必要があるドキュメントの数を制限します。

インデックスは、コレクションのデータの一部を格納する特殊なデータセットです。データが部分的であるため、読み取りが容易になります。この部分的なデータセットには、特定のフィールドの値、またはフィールドのセットが、そのフィールドの値に基づいて順序付けられて格納されます。

インデックスの影響を理解する

序論ではインデックスがクエリに有効であることを示しましたが、インデックスが多すぎると、挿入、削除、更新などの他の操作が遅くなる可能性があります。

ドキュメントに対して挿入、削除、更新といった操作が頻繁に行われる場合、インデックスもそれに合わせて頻繁に変更する必要があり、それはコレクションにとって単なるオーバーヘッドとなる。

以下の例は、コレクション内のインデックスを構成するフィールド値を示しています。インデックスは、コレクション内の単一のフィールドに基づいて作成することも、複数のフィールドに基づいて作成することもできます。

以下の例では、従業員ID「1」と従業員Code 「AA」は、コレクション内の文書をインデックス化するために使用されます。そのため、クエリ検索が行われると、これらのインデックスが使用され、コレクション内の必要な文書を迅速かつ効率的に見つけることができます。

検索クエリが従業員に基づいている場合でもCode 「AA」と入力すると、その書類は返却されます。

インデックスの影響を理解する

インデックスの作成方法: createIndex()

インデックスの作成 MongoDB を使用して行われます インデックスの作成 方法。

次の例は、コレクションにインデックスを追加する方法を示しています。ここでは、フィールド名が「Employeeid」と「EmployeeName」である、同じ Employee コレクションがあると仮定します。

createIndex を使用してインデックスを作成します。

db.Employee.createIndex({Employeeid:1})

Code 説明:

  1. その インデックスの作成 メソッドは、ドキュメントの「Employeeid」に基づいてインデックスを作成するために使用されます。
  2. 「1」パラメータは、「Employeeid」フィールドの値でインデックスを作成する際に、昇順でソートする必要があることを示します。これは、各ドキュメントを一意に識別する_idフィールドとは異なることに注意してください。 MongoDB 自動的に作成されます。ドキュメントは今後、_idフィールドではなく、従業員IDに基づいてソートされます。

コマンドが正常に実行されると、以下の出力が表示されます。

出力:

createIndex の出力

  1. numIndexesBefore: 1 は、コマンド実行前のインデックス内のフィールド値の数を示します。各コレクションには _id フィールドがあり、これもフィールド値としてカウントされるため、numIndexesBefore は 1 になります。
  2. numIndexesAfter: 2 は、コマンド実行後にインデックスに含まれるフィールド値の数を示します。
  3. 「ok: 1」という出力は、操作が成功し、新しいインデックスがコレクションに追加されたことを示します。

上記のコードは、1つのフィールド値に基づいてインデックスを作成する方法を示していますが、複数のフィールド値に基づいてインデックスを作成することも可能です。次の例は、その方法を示しています。

複数のフィールドに複合インデックスを作成する

db.Employee.createIndex({Employeeid:1, EmployeeName:1})

createIndex メソッドは、複数のフィールド値を考慮するようになりました。これにより、「Employeeid」と「EmployeeName」に基づいてインデックスが作成されます。Employeeid:1 と EmployeeName:1 は、インデックスをこれら 2 つのフィールド値に基づいて作成することを示し、:1 は昇順を表します。これは複合インデックスと呼ばれます。

インデックスの検索方法: getIndexes()

インデックスを見つける MongoDB を使用して行われます インデックスを取得する この方法。以下の例は、その方法を示しています。

getIndexesを使用してインデックスを検索する

db.Employee.getIndexes()

getIndexes メソッドは、コレクション内のすべてのインデックスを検索するために使用されます。

コマンドが正常に実行されると、以下の出力が表示されます。

出力:

getIndexesの出力

出力結果には、コレクション内に_idフィールドとEmployeeidフィールドという2つのインデックスが存在することを示すドキュメントが表示されます。:1は、インデックス内のフィールド値が昇順で作成されることを示しています。

インデックスを削除する方法: dropIndex()

インデックスを削除する MongoDB を使用して行われます ドロップインデックス この方法。以下の例は、その方法を示しています。

dropIndex を使用してインデックスを削除します

db.Employee.dropIndex({Employeeid:1})

dropIndex メソッドは、インデックスから削除する必要のあるフィールド値を指定します。

コマンドが正常に実行されると、以下の出力が表示されます。

出力:

dropIndex の出力

  1. nIndexesWas: 3 は、コマンド実行前のインデックス内のフィールド値の数を示します。各コレクションには _id フィールドがあり、これもフィールド値としてカウントされます。
  2. ok: 1 出力は、操作が成功したことを指定し、「Employeeid」フィールドがインデックスから削除されます。

コレクション内のすべてのインデックスを一度に削除するには、dropIndexes コマンドを使用します。次の例は、その方法を示しています。

dropIndexesを使用してすべてのインデックスを削除します。

db.Employee.dropIndexes()

dropIndexes メソッドは、_id インデックスを除くすべてのインデックスを削除します。

コマンドが正常に実行されると、以下の出力が表示されます。

出力:

dropIndexesの出力

  1. nIndexesWas: 2 は、コマンド実行前のインデックス内のフィールド値の数を示します。
  2. 各コレクションには_idフィールドがあり、これもフィールド値としてカウントされ、削除されません。 MongoDBそれがこのメッセージが示していることです。
  3. ok: 1 出力は、操作が成功したことを示します。

よくあるご質問

単一フィールドインデックスは、1つのフィールドのみをソートし、そのフィールドのみでフィルタリングするクエリに適しています。複合インデックスは、複数のフィールドを1つの構造でカバーし、それらのフィールドをまとめてフィルタリングまたはソートするクエリに適しています。複合インデックスは最大32個のフィールドをサポートします。

_id フィールドは MongoDBは の主キーであるため、すべてのコレクションには自動的に一意の _id インデックスが割り当てられます。削除することはできません。そのため、カスタムインデックスを追加する前から numIndexesBefore は 1 から始まります。

クエリを .explain(“executionStats”) で実行します。勝ったプランでは、IXSCAN ステージはインデックスが使用されたことを意味し、COLLSCAN は MongoDB すべての文書をスキャンしたので、新しい索引が役立つかもしれません。

$indexStats集計ステージを使用して、各インデックスへのアクセス頻度を確認してください。使用頻度が非常に低いインデックスはディスク容量を浪費し、書き込み速度を低下させるため、dropIndexを使用して削除し、コレクションを軽量化してください。

AIツールは、遅いクエリのログを分析し、インデックスを作成すべきフィールドを提案します。 MongoDBのパフォーマンスアドバイザーは、影響、ヘルプ、ping 価値の高いインデックスを追加し、重複するインデックスはスキップします。

はい。AIコパイロットアシスタントは、平易な英語のリクエストを、昇順または降順のキーや複合フィールドの順序などを含む正しいcreateIndex構文に変換し、結果として得られるインデックスを説明します。

ESRは、Equality、Sort、Rangeの略です。複合インデックスを作成する際は、まず等価一致フィールドを配置し、次にソートフィールド、最後に範囲フィルタを配置します。この順序により、 MongoDB インデックスを最も効率的に活用する。

カバードクエリは、ドキュメントを読み込むことなく、インデックスから完全に回答されます。フィルタと射影のすべてのフィールドが 1 つのインデックスに存在する場合、 MongoDB より速く結果を返します。