ポイント: 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は_idフィールドを使用して一意のインデックスを作成します。MongoDBはこれをデフォルトの_idインデックスと呼びます。このデフォルトインデックスは、コレクションから削除することはできません。
テストデータセットをクエリすると、デフォルトインデックスとして利用される_idフィールドを見ることができます:
db.studentgrades.find().pretty()
結果:
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"}
)
結果:
MongoDBでインデックスを見つける
MongoDBコレクション内のすべての利用可能なインデックスを見つけるには、getIndexes()メソッドを使用します。これにより、特定のコレクション内のすべてのインデックスが返されます。
db..getIndexes()
getIndexes() の例
次のコマンドを使用して、studentgrades コレクション内のすべてのインデックスを表示します:
db.studentgrades.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")
結果:
定義されていない名前を持つインデックスを削除するために、インデックスフィールド値を使用することもできます:
db.studentgrades.dropIndex({name:1})
結果:
デフォルトの _id インデックスを除くすべてのインデックスを削除することもできるdropIndexesコマンド。
db.studentgrades.dropIndexes()
結果:
MongoDBにおける異なるタイプのインデックスは何ですか?
MongoDBは、ユーザーのニーズに応じて利用できるさまざまなタイプのインデックスを提供します。以下は、MongoDBの主要なインデックスタイプです:
- 単一フィールドインデックス
- 複合インデックス
- マルチキーインデックス
上記の一般的なインデックスタイプに加えて、MongoDBはいくつかの特別なインデックスタイプも提供しています:
- 空間インデックス
- テストインデックス
- ハッシュインデックス
単一フィールドインデックス
これらのユーザー定義インデックスは、文書内の単一フィールドを使用して、昇順または降順 (1 または -1) でインデックスを作成します。単一フィールドインデックスでは、インデックスキーのソート順は影響しません。MongoDBはインデックスをいずれの方向にもトラバースできます。
例
db.studentgrades.createIndex({name: 1})
結果:
上記のインデックスは、名前フィールドを使用してデータを昇順にソートします。sort()メソッドを使用して、データがインデックスにどのように表示されるかを確認できます。
db.studentgrades.find({},{_id:0}).sort({name:1})
結果:
複合インデックス
MongoDBの文書で複数のフィールドを使用して複合インデックスを作成できます。このタイプのインデックスは、最初のフィールドを初期ソートに使用し、その後、前のフィールドでソートします。
例
次の複合インデックスでは、MongoDBは:
- 最初に科目フィールドでソートします
- 次に、各科目値内で成績でソートします
db.studentgrades.createIndex({subject: 1, score: -1})
インデックスは、次のようなデータ構造を作成します:
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()
結果:
では、gradesフィールドを使用してインデックスを作成しましょう。
db.studentperformance.createIndex({grades:1})
結果:
上記のコードは、MongoDBで自動的にマルチキーインデックスを作成します。配列フィールド(grades)を使用して文書をクエリすると、MongoDBはfind()メソッドで定義された配列の最初の要素を検索し、その後、全体の一致するクエリを検索します。
たとえば、次のfindクエリを考えてみましょう:
db.studentperformance.find({grades: [80, 78, 71, 89]}, {_id: 0})
最初に、MongoDBは、grades配列が任意の位置に最初の要素 (80) を含む文書を検索するためにマルチキーインデックスを使用します。その後、選択された文書の中から、すべての一致する要素を持つ文書が選択されます。
空間インデックス
MongoDBは、地理空間座標データを扱う際にデータベースクエリの効率を向上させるために、2つのタイプのインデックスを提供します:
構文:
db..createIndex( { : "2dsphere" } )
テキストインデックス
テキストインデックスタイプは、コレクション内の文字列コンテンツを検索できます。
構文:
db..createIndex( { : "text" } )
ハッシュインデックス
MongoDBのハッシュインデックスタイプは、ハッシュベースのシャーディング機能をサポートするために使用されます。これにより、指定されたフィールドのハッシュ値をインデックス化します。
構文:
db..createIndex( { : "hashed" } )
MongoDBインデックスプロパティ
インデックスの機能をさらに強化するために、インデックスプロパティを利用できます。このセクションでは、一般的に使用されるインデックスプロパティについて説明します:
- スパースインデックスプロパティ
- 部分インデックスプロパティ
- 一意インデックスプロパティ
スパースインデックスプロパティ
MongoDBのスパースプロパティでは、インデックスされたフィールドが文書に存在しない場合、コレクション内の文書をインデックス化から除外し、インデックスされたフィールドを含む文書のみをインデックス化します。
例
db.studentgrades.createIndex({notes:1},{sparse: true})
結果:
前述のstudentgradesコレクションで、notesフィールドを使用してインデックスを作成すると、notesフィールドは2つの文書にしか存在しないため、インデックスはわずか2つの文書のみをインデックス化します。
部分インデックスプロパティ
部分インデックス機能を使用すると、特定のフィルター条件に一致するインデックスを作成できます。部分インデックスは、partialFilterExpressionオプションを使用してフィルター条件を指定します。
例
db.studentgrades.createIndex(
{name:1},
{partialFilterExpression: {score: { $gte: 90}}}
)
結果:
上記のコードは、nameフィールドのインデックスを作成しますが、scoreフィールドの値が90以上の文書のみを含めます。
一意インデックスプロパティ
一意プロパティでは、ユニークな値のみを含むMongoDBインデックスを作成できます。これにより:
- インデックスされたフィールド内の重複値を拒否します
- ユニークな値を含む文書にインデックスを制限します
例
db.studentgrades.createIndex({name:1},{unique: true})
結果:
上記で作成されたインデックスは、nameフィールド内のユニークな値を持つ文書へのインデックスを制限します。
インデックスのまとめ
これでMongoDBインデックスのチュートリアルとガイドが終了しました。インデックスの作成、検索、削除の方法、異なるインデックスタイプの使用方法、複雑なインデックスの作成方法を学びました。これらのインデックスは、MongoDBデータベースの機能をさらに強化し、迅速なデータベースクエリを利用するアプリケーションのパフォーマンスを向上させるために使用できます。
関連資料
MongoDB ガイド
- MongoDB 概要: MongoDB の始め方
- Ubuntu と Mac に MongoDB をインストールする方法
- MongoDB でのデータベースの作成
- MongoDB シェル基本コマンド
- MongoDB Compass: Mongo GUI の使用
- MongoDB ロールベースのアクセス制御 (RBAC) の説明
- MongoDB プロジェクションおよびプロジェクションオペレーターの説明
- MongoDB 集約関数の説明
- MongoDB ソート: sort() メソッドと例
- MongoDB での Push および Pull オペレーターの使用
- MongoDB $unwind の使用方法
- 23 の一般的な MongoDB クエリオペレーターとその使用方法
- MongoDB 地理位置クエリの例
- MongoDB トランザクションの紹介
- MongoDB インデックス: トップインデックスタイプとその管理方法
- 知っておくべきトップ MongoDB コマンド
- MongoDB レプリケーション: 完全な紹介
- MongoDB クラスターをセットアップする方法
- MongoDB シャーディング: 概念、例、およびチュートリアル
- MongoDB Atlas: マネージド MongoDB のセットアップと使用
- MongoDB を Docker コンテナーとして実行する方法
- MongoDB メモリ使用量、管理、および要件
- MongoDB バックアップ用の mongodump の使用方法
- MongoDB バックアップを復元するための Mongorestore の例
- PyMongo の使用方法
- MongoDB と NodeJS 用の Mongoose の使用方法
- MongoDB チートシート
- MongoDB 対 Cassandra: NoSQL データベースの比較
- PostgreSQL 対 MongoDB: データベースの比較
- MySQL 対 MongoDB: データベースの比較
- MongoDB 認定: 紹介
これらの投稿は私自身の意見であり、BMC の立場、戦略、または意見を必ずしも表すものではありません。