Indexes
項目一覧
Overview
このガイドでは、MongoDB Go ドライバーでインデックスを使用する方法を学習できます。
インデックスは、MongoDB でクエリを効率的に実行するのに役立ちます。 インデックスがないと、MongoDB はコレクション内のすべてのドキュメントをスキャン(コレクションスキャン)して、クエリに一致するドキュメントを見つけます。 コレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 適切なインデックスを使用すると、MongoDB は検査するドキュメントの数を制限します。
Tip
また、更新操作、削除操作、および特定の集計パイプライン ステージではインデックスを使用できます。
クエリ範囲とパフォーマンス
MongoDB のクエリには次の要素を含めることができます。
要素 | 必要性 | 目的 |
---|---|---|
クエリ | 必須 | 検索するフィールドと値を指定します。 |
オプション | 任意 | クエリの実行方法を指定します。 |
プロジェクション | 任意 | MongoDB で返されるフィールドを指定します。 |
Sort | 任意 | MongoDB がドキュメントを返す順序を指定します。 |
これらの要素を同じインデックスで指定すると、MongoDB はインデックスから直接結果を返します。これはカバード クエリとも呼ばれます。
重要
ソート条件
ソート条件は、インデックスの順序と一致するか、その順序を逆にする必要があります。
name
昇順(AZ)でフィールドage
と降順(9-0)のフィールド のインデックスを検討します。
name_1_age_-1
MongoDB は、データを次のいずれかでソートするときにこのインデックスを使用します。
name
昇順、age
降順name
降順、age
の昇順
name
と ageの昇順、またはnameとage
の降順の並べ替え順序を指定するには、メモリ内でソートする必要があります。
インデックスがクエリ条件とプロジェクションをカバーするようにする方法については、「クエリ カバレッジ 」を参照してください。
操作上の考慮事項
クエリのパフォーマンスを向上させるには、ソートされた結果を返すクエリや操作で頻繁に表示されるフィールドにインデックスを作成します。 追加する各インデックスはディスク領域とメモリを消費するため、キャパシティー プランニングのためにインデックス メモリとディスク使用量を追跡します。 さらに、書込み操作によってインデックス フィールドが更新される場合、MongoDB は関連するインデックスも更新する必要があります。
MongoDB は動的スキーマをサポートしているため、アプリケーションは不明な名前や任意の名前を持つフィールドに対してクエリを実行できます。 MongoDB 4.2では、これらのクエリをサポートするためにワイルドカード インデックスが導入されています。 ワイルドカード インデックスは、ワークロードベースのインデックス プランニングを置き換えるように設計されていません。
データモデルの設計とアプリケーションに適したインデックスの選択について詳しくは、「インデックス作成戦略」と「データ モデリングとインデックス 」を参照してください。
インデックス タイプ
MongoDB は、データのクエリをサポートするためにいくつかのインデックス タイプをサポートしています。 以下のセクションでは、最も一般的なインデックス型について説明と作成方法を示します。 インデックス タイプの全リストは、「インデックス 」を参照してください。
単一フィールド インデックス
単一フィールド インデックスは、コレクションのドキュメント内のフィールドへの参照を保持します。
このインデックスにより、単一フィールド クエリとソート パフォーマンスが向上し、一定時間の経過後にコレクションからドキュメントを自動的に排除する TTL インデックスをサポートします。
注意
_id_
インデックスは、単一フィールド インデックスの例です。 このインデックスは、新しいコレクションを作成すると、 _id
フィールドに自動的に作成されます。
例
次の例では、 sample_mflix.movies
コレクションのtitle
フィールドに昇順でインデックスを作成します。
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{{"title", 1}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
複合インデックス
複合インデックスは、コレクションのドキュメント内の複数のフィールドへの参照を保持します。 このインデックスにより、クエリとソートのパフォーマンスが向上します。
例
次の例では、fullplot
title
sample_mflix.movies
コレクションの フィールドと フィールドに複合インデックスを作成しています。
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{ {"fullplot", -1}, {"title", 1} } } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
マルチキー インデックス(配列フィールドへのインデックス)
マルチキー インデックスは、単一フィールド インデックスおよび複合インデックスと同じ構文を使用します。 このインデックスにより、配列フィールドをインデックスとして指定するクエリのパフォーマンスが向上します。
例
次の例では、 sample_mflix.movies
コレクションのcast
フィールドにマルチキー インデックスを作成します。
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{{"cast", -1}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
クラスター化インデックス
クラスター化されたインデックスを使用すると、クラスター化されたコレクションに対する挿入、アップデート、削除操作のパフォーマンスが向上します。 クラスター化されたコレクションには、クラスター化されたインデックスのキー値順にドキュメントが保存されます。
クラスター化インデックスを作成するには、コレクションを作成するときに、 _id
フィールドをキーとして指定し、一意のフィールドをtrue
として指定して、 クラスター化インデックス オプション を指定します。
例
次の例では、 db.tea
コレクションの_id
フィールドにクラスター化インデックスを作成しています。
db := client.Database("db") cio := bson.D{{"key", bson.D{{"_id", 1}}}, {"unique", true}} opts := options.CreateCollection().SetClusteredIndex(cio) db.CreateCollection(context.TODO(), "tea", opts)
Text Indexes
テキスト インデックス は、string コンテンツに対するテキスト検索クエリをサポートします。 このインデックスには string フィールドまたは string の配列が必要です。 MongoDB は、複数の言語のテキスト検索をサポートしています。 インデックスの作成時に、オプションとしてデフォルト言語を指定できます。
コレクションには 1 つのテキスト インデックスしか含めることができません。 複数のテキストフィールドのテキストインデックスを作成する場合は、複合インデックスを作成する必要があります。 テキスト検索は、複合インデックス内のすべてのテキスト フィールドに対して実行されます。
Tip
テキスト インデックスは、より強力なAtlas Full Text Searchインデックスとは異なります。 Atlas ユーザーには Atlas Search を推奨します。
例
次の例では、 plot
フィールドに、 sample_mflix.movies
コレクション内のデフォルト言語としてitalian
を使用してテキスト インデックスを作成します。
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{Keys: bson.D{{"plot", "text"}, {"default_language", "italian"}}} name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
地理空間インデックス
MongoDB は、 2dsphere インデックスを使用することで、地理空間座標データを含むクエリをサポートします。 2dsphere
インデックスは GeoJSON オブジェクト フィールド内になければなりません。
このインデックスを使用すると、次の操作を実行できます。
包含、交差、近接性について地理空間データをクエリします。
ユークリッド平面上の距離の計算と、MongoDB 2.2 以前で使用される "legacy coordinate pairs" 構文を操作するための 。
例
sample_mflix.theaters
コレクションのドキュメントのlocation.geo
フィールドは、劇場の座標を記述する GeoJSON ポイント オブジェクトです。
{ "_id" : ObjectId("59a47286cfa9a3a73e51e75c"), "theaterId" : 104, "location" : { "address" : { "street1" : "5000 W 147th St", "city" : "Hawthorne", "state" : "CA", "zipcode" : "90250" }, "geo" : { "type" : "Point", "coordinates" : [ -118.36559, 33.897167 ] } } }
次の例では、 location.geo
フィールドに2dsphere
インデックスを作成します。
重要
地理空間インデックスによってカバーされているフィールドに地理空間インデックスを作成しようとすると、エラーが発生します。
indexModel := mongo.IndexModel{ Keys: bson.D{{"location.geo", "2dsphere"}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Unique Indexes
ユニークインデックスにより、インデックス フィールドに重複する値が格納されなくなります。デフォルトでは、MongoDB はコレクションの作成時に _id
フィールドにユニークインデックスを作成します。
一意のインデックスを作成するには、重複を防ぐフィールドまたはフィールドの組み合わせを指定し、 unique
オプションをtrue
に設定します。
例
次の例では、 theaterId
フィールドに一意の降順インデックスを作成しています。
indexModel := mongo.IndexModel{ Keys: bson.D{{"theaterId", -1}}, Options: options.Index().SetUnique(true), } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
インデックスを削除する
_id
フィールドのデフォルトの一意なインデックスを除く未使用のインデックスを削除できます。 インデックスを削除するには、インデックスの名前をDropOne()
メソッドに渡します。
次の例では、 sample_mflix.movies
コレクションのtitle
フィールドの昇順インデックスを削除します。
coll := client.Database("sample_mflix").Collection("movies") res, err := coll.Indexes().DropOne(context.TODO(), "title_1") if err != nil { panic(err) } fmt.Println(res)
詳細情報
記載されているインデックスの詳細については、次のガイドを参照してください。
上記で説明されている操作の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。