Indexes
項目一覧
Overview
このガイドでは、Rust ドライバーを使用してインデックスを作成および管理する方法を説明します。 インデックスは、MongoDB のクエリ パフォーマンスを向上させる特別なデータ構造です。
インデックスなしのコレクションに対して クエリを実行すると、MongoDB はすべてのドキュメントをスキャンして一致を見つけます。 これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 クエリを カバー するインデックスを作成すると、MongoDB は一致を見つけるために検査するドキュメントの数を制限し、パフォーマンスを向上させます。
Tip
インデックスは、更新操作、削除操作、および一部の集計パイプライン ステージで使用できます。 集計でインデックスを使用する方法の詳細については、サーバー マニュアルの「 インデックスとドキュメント フィルターによるパフォーマンスの向上」を参照してください。
クエリ範囲とパフォーマンス
次の表では、MongoDB クエリに含めることができる要素について説明しています。
要素 | 説明 |
---|---|
クエリ | Required Specifies the fields and values to match |
オプション | Optional Specify how the query executes |
プロジェクション | Optional Specifies the fields that MongoDB returns in matched
documents |
Sort | Optional Specifies the order of documents returned |
クエリ要素がすべて同じインデックスに含まれるフィールドを参照する場合、MongoDB はインデックスから直接結果を返すことができます。 このようなクエリは、カバード クエリと呼ばれます。
インデックスがクエリをカバーするようにする方法については、サーバー マニュアルの「カバーされたクエリ 」を参照してください。
重要
ソート条件
ソート条件は、インデックスの順序と一致するか、その順序を逆にする必要があります。
コレクションに、昇順(AZ)の name
フィールドと降順(9-0)のage
フィールドに次のインデックスがあるとします。
name_1_age_-1
MongoDB は、次のいずれかの構成でドキュメントをソートするときにこのインデックスを使用します。
name
昇順、age
降順name
降順、age
の昇順
両方のフィールドに同じソート順序を指定すると、MongoDB はインデックスを使用せず、代わりにメモリ内ソートを実行します。
操作上の考慮事項
クエリのパフォーマンスを向上させるには、クエリで頻繁に表示されるフィールドにインデックスを作成します。 ただし、各インデックスはディスク領域とメモリを消費するため、キャパシティー プランニングとしてインデックス メモリとディスク使用量を追跡することをお勧めします。 さらに、書込み操作によってインデックス フィールドが更新される場合、MongoDB は関連するインデックスも更新する必要があります。
MongoDB は動的スキーマをサポートしているため、アプリケーションは不明な名前や変数名を持つフィールドに対してクエリを実行できます。 MongoDB Server バージョン4.2以降に接続している場合は、これらのクエリをサポートするワイルドカード インデックスを作成できます。 このインデックス タイプの詳細については、サーバー マニュアルの「ワイルドカード インデックス」を参照してください。
インデックス タイプ
MongoDB は、クエリをサポートするための 複数のインデックス タイプ をサポートしています。 以下のセクションでは、一般的なインデックス型について説明し、コレクション内に各インデックス型を作成する方法を示します。
注意
サンプル コレクション
このガイドの例では、Atlas サンプル データのコレクションを使用します。 このデータをインポートする方法については、Atlas ドキュメントの「サンプル データのロード」チュートリアルを参照してください。
コレクションにインデックスを作成するには、 create_index()
メソッドとcreate_indexes()
メソッドを使用します。 create_index()
メソッドはIndexModel
構造体パラメータを受け取ります。このパラメータは型のbuilder()
メソッドを使用して構築できます。
インデックス タイプの完全なリストを表示するには、サーバー マニュアルの「インデックス タイプ 」を参照してください。
単一フィールド インデックス
単一フィールド インデックスはドキュメント フィールドへの参照を保持します。
このインデックスにより、単一フィールドのクエリとソートのパフォーマンスが向上します。 また、一定時間後にコレクションからドキュメントを自動的に削除する TTL インデックスもサポートしています。 TTL インデックスの詳細については、サーバー マニュアルの「 TTL インデックス」を参照してください。
新しいコレクションを作成すると、MongoDB は_id
フィールドに一意の 単一フィールド インデックスを自動的に作成します。
例
次のコードを使用することで、 sample_training.zips
コレクションのcity
フィールドに昇順のインデックスが作成されます。
let index = IndexModel::builder().keys(doc! { "city": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1
複合インデックス
複合インデックスには複数のドキュメント フィールドへの参照が保持されます。
このインデックスにより、複数のフィールドに対するクエリとソートのパフォーマンスが向上します。 複合インデックスを作成するときは、各インデックス フィールドの方向を指定する必要があります。
単一フィールド インデックスの作成と同じ構文を使用して、マルチキー インデックスを作成できます。
例
次のコードを使用することで、city
pop
sample_training.zips
コレクションの フィールドと フィールドに複合インデックスが作成されます。
let index = IndexModel::builder() .keys(doc! { "city": 1, "pop": -1 }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1_pop_-1
マルチキー インデックス(配列フィールド インデックス)
マルチキー インデックスは、配列値のあるフィールドへの参照を保持します。 このインデックスにより、配列フィールドに対するクエリのパフォーマンスが向上します。
単一フィールド インデックスの作成と同じ構文を使用して、マルチキー インデックスを作成できます。
例
次のコードを使用することで、 sample_training.posts
コレクションのtags
フィールドにマルチキー インデックスが作成されます。
let index = IndexModel::builder().keys(doc! { "tags": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: tags_1
クラスター化インデックス
クラスター化されたインデックスを使用すると、クラスター化されたコレクションに対する挿入、アップデート、削除操作のパフォーマンスが向上します。 クラスター化されたコレクションには、クラスター化されたインデックスのキー値順にドキュメントが保存されます。 これらのコレクションの詳細については、サーバー マニュアルの「クラスター化されたコレクション 」を参照してください。
クラスター化インデックスは、コレクションを作成するときにのみ作成できます。 クラスター化されたコレクションを作成するには、次の手順を実行します。
ClusteredIndex
インスタンスを作成します。create_collection()
メソッドを呼び出します。clustered_index()
メソッドをcreate_collection()
メソッドにチェーンして、ClusteredIndex
インスタンスをclustered_index()
のパラメーターとして渡します。
ClusteredIndex
構造体の次のフィールドを設定する必要があります。
キー パターンを指定する
key
フィールド。 このフィールドの値は{ _id: 1 }
である必要があります。インデックスの一意性を指定する
unique
フィールド。 このフィールドの値はtrue
である必要があります。
必要な値を自動的に使用するClusteredIndex
インスタンスを作成するには、タイプのdefault()
メソッドを呼び出します。
例
次のコードを使用することで、 sample_training
データベースにitems
という新しいコレクションを作成する際に、 _id
フィールドにデフォルト構成のクラスター化インデックスが作成されます。
let db = client.database("sample_training"); let cl_idx = ClusteredIndex::default(); db.create_collection("items") .clustered_index(cl_idx) .await?;
Text Indexes
テキスト インデックス は、string コンテンツに対するテキスト検索クエリをサポートします。 このインデックスは、string 値または string 配列値を持つフィールドを参照します。 MongoDB は、複数の言語のテキスト検索をサポートしています。 テキストインデックスを作成するときに、オプションとしてデフォルト言語を指定できます。
コレクションには 1 つのテキスト インデックスしか含めることができません。 複数のテキストフィールドにテキストインデックスを作成するには、複合インデックスを作成します。 複合インデックスの作成後にテキスト検索を実行すると、複合インデックス内のすべてのテキスト フィールドに対して検索操作が実行されます。
Tip
Atlas Full Text Search
テキスト インデックスはAtlas Full Text Searchインデックス とは異なります。 To learn more about Atlas Search indexes, see the Atlas Search Indexes guide.
例
次のコードを使用すると、 sample_training.posts
コレクションのbody
フィールドにテキスト インデックスが作成されます。 このコードでは、テキスト インデックスのデフォルト言語として"spanish"
を指定する オプションを設定します。
let idx_opts = IndexOptions::builder() .default_language("spanish".to_string()) .build(); let index = IndexModel::builder() .keys(doc! { "body": "text" }) .options(idx_opts) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: body_"text"
地理空間インデックス
MongoDB は、 2dsphere
インデックスを使用することで、地理空間座標データを含むクエリをサポートします。 GeoJSON オブジェクト値を持つフィールドに2dsphere
インデックスを作成できます。
このインデックス タイプは、次のタスクをサポートします。
地理空間データをクエリして、包含、交差、近接性を見つける
ユークリッド平面上の距離の計算
重要
同じフィールドに 2 つの地理空間インデックスを作成することはできません。
例
sample_mflix.theaters
コレクション内の次のサンプル ドキュメントには、フィールドlocation.geo
が含まれています。 このフィールドには GeoJSON ポイント値があります。
{ "_id": ..., "theaterId": ..., "location": { "address": ..., "geo": { "type": "Point", "coordinates": [ -93.24565, 44.85466 ] } } }
次のコードを使用することで、 sample_mflix.theaters
コレクションのlocation.geo
フィールドに地理空間2dsphere
インデックスが作成されます。
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
Unique Indexes
一意のインデックス により、インデックス フィールドに重複する値が保存されなくなります。 デフォルトでは、コレクションを作成すると、MongoDB は_id
フィールドに一意の単一フィールド インデックスを作成します。
一意のインデックスを作成するには、一意性を維持するフィールドまたはフィールドの組み合わせを指定し、 unique
オプションをtrue
に設定します。
例
次のコードは、 IndexOptions
インスタンスでunique
フィールドをtrue
に設定し、 IndexModel
の作成時にこれらのオプションを渡す方法を示しています。
let opts = IndexOptions::builder().unique(true).build(); let index = IndexModel::builder() .keys(doc! { "_id": -1 }) .options(opts) .build();
インデックスを削除する
_id
フィールドのデフォルトの一意なインデックスを除くすべてのインデックスをコレクションから削除または削除できます。 インデックスを削除するには、インデックスの名前をdrop_index()
メソッドに渡します。
Tip
すべてのインデックスを削除する
drop_indexes()
メソッドを使用して、 _id
インデックスを除くコレクションのすべてのインデックスを一度に削除できます。
次の例では、 sample_training.zips
コレクションからcity_1
というインデックスを削除します。
my_coll.drop_index("city_1".to_string()).await?;
詳細情報
データモデルの設計とアプリケーションに適したインデックスの作成の詳細については、サーバー マニュアルの「インデックス作成戦略」と「 運用上の要因とデータモデル」を参照してください。
読み取り操作の実行の詳細については、「読み取り操作」カテゴリのガイドを参照してください。
このガイドで言及されている概念の詳細については、次のサーバー ドキュメントを参照してください。
API ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。