MongoDB インデックス: トップインデックスタイプとその管理方法

MongoDB インデックス: トップインデックスタイプとその管理方法

  • オーケストレーション
6分で読めます 更新日 Apr 21, 2025

ポイント: MongoDBインデックスはデータ取得速度を向上させ、ドキュメントのスキャンを最小限に抑えることで効率的なクエリを可能にします。このガイドでは、さまざまなインデックスタイプ、作成方法、およびパフォーマンスの考慮事項について詳しく説明します。

  • インデックスタイプには、単一フィールド、複合、マルチキー、地理空間、テキスト、およびハッシュインデックスが含まれます。
  • ユニークおよびスパースインデックスはデータの整合性を維持し、ストレージを最適化します。

MongoDB インデックスは、ユーザーにデータを効率的にクエリする方法を提供します。 インデックスなしでデータをクエリする場合、クエリはデータベース内のすべてのレコードを検索して、クエリに一致するデータを見つける必要があります。

MongoDB では、インデックスなしでのクエリをコレクションスキャンと呼びます。 コレクションスキャンは:

  • さまざまなパフォーマンスのボトルネックを引き起こします
  • アプリケーションの速度を著しく低下させます

幸いなことに、MongoDB インデックスを使用することで、これらの問題を両方とも修正できます。 クエリされるドキュメントの数を制限することで、アプリケーションの全体的なパフォーマンスが向上します。

このチュートリアルでは、さまざまな種類のインデックスを紹介し、MongoDB での作成、検索、管理方法を示します。

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

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

MongoDB インデックスは、データベースをクエリする際に速度を向上させる特別なデータ構造です。 データセットの小さな部分を効率的に保存することにより、データを見つけて取得する速度が向上します。 データ コレクション内のすべてのドキュメントをスキャンする必要はありません。

MongoDB インデックスは、インデックスされたフィールドの値をデータ コレクションの外部に保存し、ディスク内の場所を追跡します。 インデックスされたフィールドは値に基づいて順序付けられています。 それにより、等価マッチを効率的に実行し、範囲ベースのクエリを作成することが容易になります。 コレクション レベルで MongoDB インデックスを定義でき、コレクション内の任意のフィールドまたはサブフィールドのインデックスがサポートされます。

Atlas CLI または Atlas UI を使用して、データ コレクションのインデックスを管理できます。 両方ともクエリの実行をより効率的にします。

MongoDB でインデックスが必要な理由

インデックスは MongoDB にとって非常に重要です。 コレクション内の情報を整理するための効率的な方法であり、クエリを高速化し、関連する結果を迅速に返します。 インデックスを使用してデータをグループ化、ソート、取得することで、かなりの時間を節約できます。 データベース エンジンは、マッチを見つけるために各レコードをスキャンする必要がなくなります。

インデックスの欠点は何ですか?

インデックスにはいくつかの欠点があります。 書き込み時のパフォーマンスは、作成する各インデックスによって影響を受け、各インデックスはディスクスペースを占有します。 コレクションの肥大化や書き込みの遅延を避けるために、真に必要なインデックスのみを作成してください。

インデックスは何個使用できますか?

MongoDB インデックスは、データ コレクションごとに 64 に制限されています。 複合インデックスでは、最大 32 のフィールドを持つことができます。 $text クエリには特別なテキストインデックスが必要です - 異なるタイプの特別インデックスが必要な他のクエリオペレーターと組み合わせることはできません。

インデックスの操作

このチュートリアルでは、MongoDB のインデックス機能を示すために次のデータセットを使用します:

    use students
db.createCollection("studentgrades")
db.studentgrades.insertMany(
    [
        {name: "Barry", subject: "Maths", score: 92},
        {name: "Kent", subject: "Physics", score: 87},
        {name: "Harry", subject: "Maths", score: 99, notes: "Exceptional Performance"},
        {name: "Alex", subject: "Literature", score: 78},
        {name: "Tom", subject: "History", score: 65, notes: "Adequate"}
    ]
)
db.studentgrades.find({},{_id:0})

結果

MongoDB のインデックス機能を示すデータセット。

MongoDBのインデックスは一意ですか?

コレクション内で文書を作成すると、MongoDBは_idフィールドを使用して一意のインデックスを作成します。MongoDBはこれをデフォルトの_idインデックスと呼びます。このデフォルトインデックスは、コレクションから削除することはできません。

テストデータセットをクエリすると、デフォルトインデックスとして利用される_idフィールドを見ることができます:

    db.studentgrades.find().pretty()

結果:

_id フィールドはデフォルトの _id インデックスです。

MongoDBでインデックスを作成する方法

MongoDBでインデックスを作成するには、次の構文を使用してcreateIndex()メソッドを使用します:

    db..createIndex(, )

インデックスを作成するときは、インデックスされるフィールドとキーの方向 (1 または -1) を定義して、昇順または降順を示します。

降順の単一フィールドインデックスを使用すると、パフォーマンスが低下する可能性があります。最適な結果を得るには、昇順の単一フィールドインデックスを使用する方が良いです。

もう1つの考慮すべき点は、インデックス名です。デフォルトでは、MongoDBはインデックス名をインデックスされたキーと、インデックス内の各キーの方向をアンダースコアで区切って連結することによって生成します。たとえば: {name: 1} は、name_1として作成されます。

ベストプラクティスは、インデックスを作成するときに名前オプションを使用してカスタムインデックス名を定義することです。インデックスは作成後に名前を変更することはできません。インデックスの名前を変更する唯一の方法は、そのインデックスを最初に削除し、以下に示すように、希望の名前で再作成することです。

createIndex()の例

studentgradesコレクション内のnameフィールドを使用してインデックスを作成し、student name indexとして名付けましょう。

    db.studentgrades.createIndex(
{name: 1},
{name: "student name index"}
)

結果:

student name index というインデックスを作成します。

MongoDBでインデックスを見つける

MongoDBコレクション内のすべての利用可能なインデックスを見つけるには、getIndexes()メソッドを使用します。これにより、特定のコレクション内のすべてのインデックスが返されます。

    db..getIndexes()

getIndexes() の例

次のコマンドを使用して、studentgrades コレクション内のすべてのインデックスを表示します:

    db.studentgrades.getIndexes()

結果:

MongoDB における getIndexes() の例。

出力には、デフォルトの _id インデックスとユーザー作成のインデックスstudent name indexが含まれています。

MongoDB のインデックスをリストする方法

シェルまたは Compass を使用してデータ コレクションのインデックスをリストできます。 このコマンドは、インデックス ドキュメントの配列を返します:

    db.collection.getIndexes()

代わりに、MongoDB Atlas UI を使用することもできます。 クラスターを開き、コレクションタブに移動します。 データベースとコレクションを選択し、インデックスをクリックしてリストを表示します。

最後に、MongoDB Atlas CLI で次のコマンドを使用してインデックスを表示できます:

    atlas clusters index list --clusterName  --db  --collection

MongoDB でインデックスを削除する方法

MongoDB コレクションからインデックスを削除またはドロップするには、削除するインデックス名を指定してdropIndex()メソッドを使用します。

    db..dropIndex()

dropIndex() の例

以下に示すように、インデックス名student name indexを持つユーザー作成インデックスを削除します。

    db.studentgrades.dropIndex("student name index")

結果:

名前のない MongoDB インデックスを削除する方法の例。

定義されていない名前を持つインデックスを削除するために、インデックスフィールド値を使用することもできます:

    db.studentgrades.dropIndex({name:1})

結果:

名前のない MongoDB インデックスを削除する方法の例。

デフォルトの _id インデックスを除くすべてのインデックスを削除することもできるdropIndexesコマンド。

    db.studentgrades.dropIndexes()

結果:

すべての MongoDB インデックスを削除する方法の例。

MongoDBにおける異なるタイプのインデックスは何ですか?

MongoDB におけるさまざまな種類のインデックス。

MongoDBは、ユーザーのニーズに応じて利用できるさまざまなタイプのインデックスを提供します。以下は、MongoDBの主要なインデックスタイプです:

  • 単一フィールドインデックス
  • 複合インデックス
  • マルチキーインデックス

上記の一般的なインデックスタイプに加えて、MongoDBはいくつかの特別なインデックスタイプも提供しています:

  • 空間インデックス
  • テストインデックス
  • ハッシュインデックス

単一フィールドインデックス

これらのユーザー定義インデックスは、文書内の単一フィールドを使用して、昇順または降順 (1 または -1) でインデックスを作成します。単一フィールドインデックスでは、インデックスキーのソート順は影響しません。MongoDBはインデックスをいずれの方向にもトラバースできます。

例

    db.studentgrades.createIndex({name: 1})

結果:

MongoDB での単一フィールドインデックスの作成。

上記のインデックスは、名前フィールドを使用してデータを昇順にソートします。sort()メソッドを使用して、データがインデックスにどのように表示されるかを確認できます。

    db.studentgrades.find({},{_id:0}).sort({name:1})

結果:

sort() メソッドを使用してデータを見る。

複合インデックス

MongoDBの文書で複数のフィールドを使用して複合インデックスを作成できます。このタイプのインデックスは、最初のフィールドを初期ソートに使用し、その後、前のフィールドでソートします。

例

次の複合インデックスでは、MongoDBは:

  • 最初に科目フィールドでソートします
  • 次に、各科目値内で成績でソートします
    db.studentgrades.createIndex({subject: 1, score: -1})
MongoDB 複合インデックスの例。

インデックスは、次のようなデータ構造を作成します:

    db.studentgrades.find({},{_id:0}).sort({subject:1, score:-1})

結果:

インデックスデータ構造。

MongoDBは配列フィールドのインデックスをサポートしています。配列を含むフィールドのインデックスを作成すると、MongoDBは配列内の各要素に対して個別のインデックスエントリを作成します。これらのマルチキーインデックスにより、ユーザーは配列内の要素を使用して文書をクエリできます。

MongoDBは、ユーザーが明示的にマルチキータイプを定義する必要なしに、配列フィールドに出会ったときに自動的にマルチキーインデックスを作成します。

新しいデータセットを作成して、MongoDBでマルチキーインデックスを作成する例を示します。

    db.createCollection("studentperformance")
db.studentperformance.insertMany(
[
{name: "Barry", school: "ABC Academy", grades: [85, 75, 90, 99] },
{name: "Kent", school: "FX High School", grades: [74, 66, 45, 67]},
{name: "Alex", school: "XYZ High", grades: [80, 78, 71, 89]},
]
)
db.studentperformance.find({},{_id:0}).pretty()

結果:

MongoDB でのマルチキーインデックスデータセットの作成。

では、gradesフィールドを使用してインデックスを作成しましょう。

    db.studentperformance.createIndex({grades:1})

結果:

MongoDB でのマルチキーインデックスの作成。

上記のコードは、MongoDBで自動的にマルチキーインデックスを作成します。配列フィールド(grades)を使用して文書をクエリすると、MongoDBはfind()メソッドで定義された配列の最初の要素を検索し、その後、全体の一致するクエリを検索します。

たとえば、次のfindクエリを考えてみましょう:

    db.studentperformance.find({grades: [80, 78, 71, 89]}, {_id: 0})

最初に、MongoDBは、grades配列が任意の位置に最初の要素 (80) を含む文書を検索するためにマルチキーインデックスを使用します。その後、選択された文書の中から、すべての一致する要素を持つ文書が選択されます。

空間インデックス

MongoDBは、地理空間座標データを扱う際にデータベースクエリの効率を向上させるために、2つのタイプのインデックスを提供します:

  • 2dインデックスは、MongoDB 2.2以前に使用されていた古い座標ペア向けの平面幾何学を使用します。
  • 2dsphereインデックスは、球面幾何学を使用します。

構文:

    db..createIndex( {  : "2dsphere" } )

テキストインデックス

テキストインデックスタイプは、コレクション内の文字列コンテンツを検索できます。

構文:

    db..createIndex( { : "text" } )

ハッシュインデックス

MongoDBのハッシュインデックスタイプは、ハッシュベースのシャーディング機能をサポートするために使用されます。これにより、指定されたフィールドのハッシュ値をインデックス化します。

構文:

    db..createIndex( {  : "hashed" } )

MongoDBインデックスプロパティ

インデックスの機能をさらに強化するために、インデックスプロパティを利用できます。このセクションでは、一般的に使用されるインデックスプロパティについて説明します:

  • スパースインデックスプロパティ
  • 部分インデックスプロパティ
  • 一意インデックスプロパティ

スパースインデックスプロパティ

MongoDBのスパースプロパティでは、インデックスされたフィールドが文書に存在しない場合、コレクション内の文書をインデックス化から除外し、インデックスされたフィールドを含む文書のみをインデックス化します。

例

    db.studentgrades.createIndex({notes:1},{sparse: true})

結果:

MongoDB におけるスパースインデックスプロパティの例。

前述のstudentgradesコレクションで、notesフィールドを使用してインデックスを作成すると、notesフィールドは2つの文書にしか存在しないため、インデックスはわずか2つの文書のみをインデックス化します。

部分インデックスプロパティ

部分インデックス機能を使用すると、特定のフィルター条件に一致するインデックスを作成できます。部分インデックスは、partialFilterExpressionオプションを使用してフィルター条件を指定します。

例

    db.studentgrades.createIndex(
{name:1},
{partialFilterExpression: {score: { $gte: 90}}}
)

結果:

MongoDB における部分インデックスプロパティの例。

上記のコードは、nameフィールドのインデックスを作成しますが、scoreフィールドの値が90以上の文書のみを含めます。

一意インデックスプロパティ

一意プロパティでは、ユニークな値のみを含むMongoDBインデックスを作成できます。これにより:

  • インデックスされたフィールド内の重複値を拒否します
  • ユニークな値を含む文書にインデックスを制限します

例

    db.studentgrades.createIndex({name:1},{unique: true})

結果:

MongoDB におけるユニークインデックスプロパティの例。

上記で作成されたインデックスは、nameフィールド内のユニークな値を持つ文書へのインデックスを制限します。

インデックスのまとめ

これでMongoDBインデックスのチュートリアルとガイドが終了しました。インデックスの作成、検索、削除の方法、異なるインデックスタイプの使用方法、複雑なインデックスの作成方法を学びました。これらのインデックスは、MongoDBデータベースの機能をさらに強化し、迅速なデータベースクエリを利用するアプリケーションのパフォーマンスを向上させるために使用できます。

関連資料

MongoDB ガイド

  1. MongoDB 概要: MongoDB の始め方
  2. Ubuntu と Mac に MongoDB をインストールする方法
  3. MongoDB でのデータベースの作成
  4. MongoDB シェル基本コマンド
  5. MongoDB Compass: Mongo GUI の使用
  6. MongoDB ロールベースのアクセス制御 (RBAC) の説明
  7. MongoDB プロジェクションおよびプロジェクションオペレーターの説明
  8. MongoDB 集約関数の説明
  9. MongoDB ソート: sort() メソッドと例
  10. MongoDB での Push および Pull オペレーターの使用
  11. MongoDB $unwind の使用方法
  12. 23 の一般的な MongoDB クエリオペレーターとその使用方法
  13. MongoDB 地理位置クエリの例
  14. MongoDB トランザクションの紹介
  15. MongoDB インデックス: トップインデックスタイプとその管理方法
  16. 知っておくべきトップ MongoDB コマンド
  17. MongoDB レプリケーション: 完全な紹介
  18. MongoDB クラスターをセットアップする方法
  19. MongoDB シャーディング: 概念、例、およびチュートリアル
  20. MongoDB Atlas: マネージド MongoDB のセットアップと使用
  21. MongoDB を Docker コンテナーとして実行する方法
  22. MongoDB メモリ使用量、管理、および要件
  23. MongoDB バックアップ用の mongodump の使用方法
  24. MongoDB バックアップを復元するための Mongorestore の例
  25. PyMongo の使用方法
  26. MongoDB と NodeJS 用の Mongoose の使用方法
  27. MongoDB チートシート
  28. MongoDB 対 Cassandra: NoSQL データベースの比較
  29. PostgreSQL 対 MongoDB: データベースの比較
  30. MySQL 対 MongoDB: データベースの比較
  31. MongoDB 認定: 紹介

これらの投稿は私自身の意見であり、BMC の立場、戦略、または意見を必ずしも表すものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。