Overview
このガイドでは、 Cドライバーでインデックスを使用する方法を学習できます。インデックスはクエリの効率を向上させ、ドキュメントのクエリと保存に機能を追加します。
インデックスがないと、MongoDB はコレクション内のすべてのドキュメントをスキャンして 、各クエリに一致するドキュメントを見つける必要があります。 これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 ただし、クエリに適切なインデックスがある場合、MongoDB はそのインデックスを使用して検査する必要があるドキュメントを制限できます。
操作上の考慮事項
クエリのパフォーマンスを向上させるには、ソートされた結果を返すアプリケーションのクエリや操作で頻繁に表示されるフィールドにインデックスをビルドします。 追加する各インデックスはアクティブな場合にディスク領域とメモリを消費するため、キャパシティー プランニングとしてインデックス メモリとディスク使用量を追跡することをお勧めします。 さらに、書込み操作によってインデックス付きフィールドが更新されると、MongoDB は関連するインデックスを更新するため、書込み操作のパフォーマンスに悪影響を与える可能性があります。
MongoDB アプリケーションでワイルドカード インデックスを使用して、名前が事前に確認されていない、または任意のフィールドに対してクエリを実行できます。 ワイルドカード インデックスは、ワークロードベースのインデックス プランニングを置き換えるように設計されていません。
データモデルの設計とアプリケーションに適したインデックスの選択の詳細については、 マニュアルの「 データ モデリングとインデックス MongoDB Server」のガイドを参照してください。
サンプル データ
このガイドの例では、Atlasサンプルデータセットの データベース内の moviestheatersコレクションとsample_mflix コレクションを使用します。 MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイド を参照してください。
インデックスの作成
MongoDB は、データのクエリに役立ついくつかの異なるインデックス タイプをサポートしています。 以下のページでは、最も一般的なインデックス型について説明し、各インデックス型を作成するためのサンプルコードを示します。
以下のセクションでは、他の一般的なインデックス型について説明し、各インデックス型を作成するためのサンプルコードを示します。
地理空間インデックス
次の例では、theatersコレクションに GeoJSON オブジェクトを含む location.geoフィールドに 2dsphereインデックスを作成します。
bson_error_t error; bson_t *keys = BCON_NEW("location.geo", BCON_UTF8("2dsphere")); mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL); if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) { printf("Successfully created index\n"); } else { fprintf(stderr, "Failed to create index: %s", error.message); } bson_destroy(keys); mongoc_index_model_destroy(index_model);
GeoJSONデータ型の詳細については、 MongoDB Serverマニュアルの 「 GeoJSON オブジェクト」 を参照してください。
ユニークインデックス
次の例では、titleフィールドに昇順のユニークインデックスを作成しています。
bson_error_t error; bson_t *keys = BCON_NEW("title", BCON_INT32(1)); bson_t *opts = BCON_NEW("unique", BCON_BOOL(true)); mongoc_index_model_t *index_model = mongoc_index_model_new(keys, opts); if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) { printf("Successfully created index\n"); } else { fprintf(stderr, "Failed to create index: %s", error.message); } bson_destroy(keys); bson_destroy(opts); mongoc_index_model_destroy(index_model);
ワイルドカード インデックス
次の例では、指定されたコレクションに昇順のワイルドカードを作成しています。
bson_error_t error; bson_t *keys = BCON_NEW("$**", BCON_INT32(1)); mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL); if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) { printf("Successfully created index\n"); } else { fprintf(stderr, "Failed to create index: %s", error.message); } bson_destroy(keys); mongoc_index_model_destroy(index_model);
クラスター化されたインデックス
次の例では、 _idフィールドに昇順のクラスターインデックスを含む新しいコレクションを作成します。
bson_error_t error; bson_t *opts = BCON_NEW("clusteredIndex", "{", "key", "{", "_id", BCON_INT32(1), "}", "unique", BCON_BOOL(true), "}"); mongoc_database_t *database = mongoc_client_get_database(client, "sample_mflix"); if (mongoc_database_create_collection(database, "clustered_collection", opts, &error)) { printf("Successfully created collection\n"); } else { fprintf(stderr, "Failed to create collection: %s", error.message); } mongoc_database_destroy(database); bson_destroy(opts);
Text Index
次の例では、title stringフィールドにテキストインデックスを作成しています。
bson_error_t error; bson_t *keys = BCON_NEW("title", BCON_UTF8("text")); mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL); if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) { printf("Successfully created index\n"); } else { fprintf(stderr, "Failed to create index: %s", error.message); } bson_destroy(keys); mongoc_index_model_destroy(index_model);
インデックスを削除する
_idフィールドのデフォルトのデフォルトユニークインデックスを除く未使用のインデックスを削除できます。 mongoc_collection_t 構造、インデックス名、オプションの bson_error_t 構造を mongoc_collection_drop_index() 関数に渡して、コレクションからインデックスを削除します。
次の例では、 moviesコレクションから"_title_"という名前のインデックスを削除します。
bson_error_t error; if (mongoc_collection_drop_index(collection, "_title_", &error)) { printf("Successfully dropped index\n"); } else { fprintf(stderr, "Failed to drop index: %s", error.message); }
注意
複合テキスト インデックスから単一のフィールドを削除することはできません。 インデックス フィールドを更新するには、インデックス全体を削除し、新しいインデックスを作成する必要があります。
API ドキュメント
このガイドで説明されている関数の詳細については、次のAPIドキュメントを参照してください。