MongoDB インデックス

インデックスは通常、クエリの効率を大幅に向上させることができます。インデックスがない場合、MongoDB はデータを読み取る際にコレクション内のすべてのドキュメントをスキャンし、クエリ条件に一致するレコードを選択する必要があります。

このようにコレクション全体をスキャンするクエリの効率は非常に低くなります。特に大量のデータを処理する場合、クエリに数十秒から数分かかることがあり、これはWebサイトのパフォーマンスにとって非常に致命的です。

インデックスは特別なデータ構造であり、走査して読み取りやすいデータ集合に格納されます。インデックスは、データベーステーブル内の1つまたは複数の列の値を並べ替える構造です。

MongoDB でよく使用されるインデックスの種類は次のとおりです。

  • 単一フィールドインデックス:単一のフィールドに基づくインデックス。
  • 複合インデックス:複数のフィールドの組み合わせに基づくインデックス。
  • テキストインデックス:全文検索をサポートするために使用されます。
  • 地理空間インデックス:地理空間データのクエリに使用されます。
  • ハッシュインデックス:フィールド値をハッシュ処理するためのインデックス。

インデックスの作成

MongoDB はインデックスを作成するために createIndex() メソッドを使用します。

3.0.0 より前のバージョンでは、インデックス作成メソッドは db.collection.ensureIndex() でした。以降のバージョンでは db.collection.createIndex() メソッドが使用されています。ensureIndex() はまだ使用できますが、createIndex() のエイリアスにすぎません。

構文

createIndex() メソッドの基本的な構文形式は次のとおりです。

db.collection.createIndex( keys, options )
  • db:データベースの参照。
  • collection:コレクションの名前。
  • keys:フィールド名とインデックスの並べ替え方向を指定するオブジェクト(1 は昇順、-1 は降順)。
  • options:インデックスの追加オプションを含めることができるオプションのパラメータ。

options パラメータはオブジェクトであり、さまざまな構成オプションを含めることができます。以下は、よく使用されるオプションです。

  • unique:次のように設定するとtrue、一意インデックスが作成され、インデックスフィールドの値がコレクション内で一意であることが保証されます。
  • background:次のように設定するとtrue、インデックス作成プロセスはバックグラウンドで実行され、他のデータベース操作には影響しません。
  • name:インデックスの名前を指定します。指定しない場合、MongoDB はインデックスのフィールドに基づいて自動的に名前を生成します。
  • sparse:次のように設定するとtrue、スパースインデックスが作成され、インデックスフィールドを含むドキュメントのみがインデックス化されます。
  • expireAfterSeconds:インデックスフィールドの有効期限を設定します。MongoDB は期限切れのドキュメントを自動的に削除します。
  • v:インデックスバージョン。通常は手動で設定する必要はありません。
  • weights:テキストインデックスの重みを指定します。

例

// age フィールドの昇順インデックスを作成
db.myCollection.createIndex({ age: 1 });
// name フィールドのテキストインデックスを作成
db.myCollection.createIndex({ name: "text" });

例

インデックスの作成:

例

// 一意インデックスを作成
db.collection.createIndex( { field: 1 }, { unique: true } )

// バックグラウンドで実行されるインデックスを作成
db.collection.createIndex( { field: 1 }, { background: true } )

// スパースインデックスを作成
db.collection.createIndex( { field: 1 }, { sparse: true } )

// テキストインデックスを作成し、重みを指定
db.collection.createIndex( { field: "text" }, { weights: { field: 10 } } )
地理空間インデックスの作成
地理位置データを格納するフィールドには、2dsphere または 2d インデックスタイプを使用して地理空間インデックスを作成できます。

// 球形の地理データに適した 2dsphere インデックス
db.collection.createIndex( { location: "2dsphere" } )

// 平面の地理データに適した 2d インデックス
db.collection.createIndex( { location: "2d" } )

ハッシュインデックスの作成

MongoDB 3.2 以降では、ハッシュインデックスを使用してフィールドをハッシュ化し、広範囲の数値検索をサポートできます。

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

インデックスの表示

getIndexes() メソッドを使用すると、コレクション内のすべてのインデックスを表示できます。

db.collection.getIndexes()

インデックスの削除

dropIndex() または dropIndexes() メソッドを使用してインデックスを削除できます。

例

// 指定したインデックスを削除
db.collection.dropIndex( "indexName" )

// すべてのインデックスを削除
db.collection.dropIndexes()

インデックス戦略

インデックスを作成する際は、以下の要素を考慮する必要があります。

  • クエリ頻度:クエリで頻繁に使用されるフィールドを優先的に検討します。
  • フィールドのカーディナリティ:フィールド値のカーディナリティが高い(つまり一意の値が多い)ほど、インデックスの効果は向上します。
  • インデックスのサイズ:インデックスのサイズは、データベースのメモリ使用量とクエリパフォーマンスに影響します。

インデックスの最適化

インデックスを最適化する際は、以下の方法を検討できます。

  • 適切なインデックスタイプを選択する:クエリの要件に応じて適切なインデックスタイプを選択します。
  • 複合インデックスの作成:頻繁に一緒に使用されるフィールドについては、クエリ効率を向上させるために複合インデックスの作成を検討します。
  • インデックスパフォーマンスの監視:インデックスの使用状況を定期的に監視し、実際のニーズに応じてインデックスを調整します。

注意事項

  • インデックスはクエリパフォーマンスを向上させることができますが、書き込み操作のオーバーヘッドも増加させます。そのため、インデックスを作成する際には、クエリパフォーマンスと書き込みパフォーマンスのバランスを考慮する必要があります。
  • インデックスは追加のストレージ領域を占有します。特に大規模なデータセットの場合は、インデックスのストレージコストを考慮する必要があります。

インデックスを適切に設計して使用することで、MongoDB データベースのクエリパフォーマンスと応答速度を大幅に向上させ、アプリケーションの要件をより適切にサポートできます。

その他の拡張