インデックスによるクエリの最適化
項目一覧
Overview
このガイドでは、Mongoid でインデックスを使用する方法を学習できます。インデックスは、 MongoDBがスキャンする必要があるドキュメント数を制限することで、クエリの効率を向上させることができます。 アプリケーションで特定のフィールドに対して繰り返しクエリが実行中場合は、それらのフィールドにインデックスを作成してクエリのパフォーマンスを向上させることができます。
このガイドの次のセクションでは、Mongoid を使用してさまざまなタイプのインデックスを宣言して作成する方法について説明します。 例では、sample_restaurants
データベース内の restaurants
コレクションにマッピングする Restaurant
モデルを使用します。 Mongoid を使用してこのデータベースとコレクションに接続する方法については、「 クイック スタート - Ruby on Rails 」または「 クイック スタート - Sinatra 」のガイドを参照してください。
インデックスの宣言と作成
Mongoid を使用する場合、index
マイクロを使用してインデックスを宣言し、create_indexes
コマンドを使用してインデックスを作成できます。
次のコード例は、 Restaurant
クラスの cuisine
フィールドに cuisine_index
という名前の昇順インデックスを宣言して作成する方法を示しています。
class Restaurant include Mongoid::Document field :name, type: String field :cuisine, type: String field :borough, type: String index({ cuisine: 1}, { name: "cuisine_index", unique: false }) end Restaurant.create_indexes
index
マニュアルは作成するインデックスを定義し、create_indexes
コマンドは restaurants
コレクションにそれを作成します。
インデックスを定義する場合、最初のハッシュオブジェクトにはインデックスを作成するフィールドとその方向が含まれます。 1
は昇順インデックスを表し、-1
は降順インデックスを表します。 2 番目のハッシュオブジェクトには、インデックスオプションが含まれています。 インデックスオプションの詳細については、 APIドキュメントのセクションを参照してください。
エイリアスと宣言インデックス
インデックス定義では、エイリアスのフィールド名を使用できます。 例、次のコードでは、borough
フィールドのエイリアスである b
フィールドにインデックスが作成されます。
class Restaurant include Mongoid::Document field :borough, as: :b index({ b: 1}, { name: "borough_index" }) end
埋め込みドキュメント フィールドでのインデックスの作成
埋め込みドキュメントフィールドにインデックスを定義できます。 次のコード例は、 Restaurant
モデルの address
フィールドに埋め込まれている street
フィールドで昇順のインデックスを宣言する方法を示しています。
class Address include Mongoid::Document field :street, type: String end class Restaurant include Mongoid::Document embeds_many :addresses index({"addresses.street": 1}) end
複合インデックスの作成
複数のフィールドに複合インデックスを定義できます。 次のコード例は、 borough
フィールドで昇順、name
フィールドで降順の複合インデックスを宣言する方法を示しています。
class Restaurant include Mongoid::Document field :name, type: String field :borough, type: String index({borough: 1, name: -1}, { name: "compound_index"}) end
地理空間インデックスの作成
GeoJSON オブジェクトまたは座標ペアを含むフィールドに 2dsphereインデックスを定義できます。 次の例では、 GeoJSON オブジェクトを含むフィールドに 2dsphereインデックスを定義します。
class Restaurant include Mongoid::Document field :location, type: Array index({location: "2dsphere"}, { name: "location_index"}) end
2dsphere インデックスの詳細については、 MongoDB Serverマニュアルの2 dsphereガイドを参照してください。
GeoJSON タイプの詳細については、 MongoDB Serverマニュアルの 「GeoJSON オブジェクト」ガイドを参照してください。
スパース インデックスの作成
すべてのドキュメントに存在しないフィールドに スパースインデックスを定義できます。 次のコード例では、 borough
フィールドにスパースインデックスを定義します。
class Restaurant include Mongoid::Document field :name, type: String field :cuisine, type: String field :borough, type: String index({ borough: 1}, { sparse: true }) end
スパース インデックスの詳細については、 MongoDB Serverマニュアルの「 スパース インデックス 」ガイドを参照してください。
複数のインデックスの作成
モデル内で複数のインデックスを定義し、1 回の create_indexes
呼び出しを使用してそれらを作成できます。 次の例は、複数のインデックスを同時に作成する方法を示しています。
class Restaurant include Mongoid::Document field :name, type: String field :cuisine, type: String field :borough, type: String index({ name: 1}) index({ cuisine: -1}) end Restaurant.create_indexes
インデックスの削除
コレクション内のすべてのインデックスを削除できます 。 次の例では、 Restaurant
モデル内の すべての インデックスを削除しています。
Restaurant.remove_indexes
注意
Default Index
MongoDB は、コレクションの作成 中に _id
フィールドにデフォルトのインデックスを作成します。 このインデックス、クライアントが _id
フィールドに同じ値を持つ 2 つのドキュメントを挿入するのを防止できます。 このインデックスは削除できません。
Atlas Search インデックス
Mongoid を使用して Atlas Search インデックスを宣言および管理できます。
検索インデックスを宣言するには、モデル内で search_index
マイクロを使用します。 モデル内で宣言された検索インデックスを作成するには、create_search_indexes
コマンドを使用します。 次のコード例は、 my_search_index
という名前の Atlas Searchインデックスを宣言して作成する方法を示しています。 インデックスはname
と cuisine
フィールドにあり、動的です。
class Restaurant include Mongoid::Document field :name, type: String field :cuisine, type: String field :borough, type: String search_index :my_search_index, mappings: { fields: { name: { type: "string" }, cuisine: { type: "string" } }, dynamic: true } end Restaurant.create_search_indexes
Atlas Searchインデックスの作成構文の詳細については、 MongoDB Atlasドキュメントの「 Atlas Search インデックスの作成 」ガイドを参照してください。
Atlas Search インデックスの削除
Atlas Searchインデックスを削除するには、remove_search_indexes
コマンドを使用します。 次のコード例は、 restaurants
コレクションから Atlas Searchインデックスを削除する方法を示しています。
Restaurant.remove_search_indexes
Atlas Search インデックスの一覧表示
search_indexes
コマンドを使用して、コレクション内のすべての Atlas Search インデックスを列挙できます。 次の例では、 restaurants
コレクション内のすべての Atlas Search インデックスを列挙し、その情報を出力します。
Restaurant.search_indexes.each { |index| puts index }
API ドキュメント
Mongoid でインデックスを使用する方法の詳細については、 Mongoid::Indexable::Classメソッドs ドキュメントを参照してください。
インデックスオプションの詳細については、 Mongoid::Indexable::Validator::Options のドキュメントを参照してください。
Mongoid で Atlas Search インデックスを使用する方法の詳細については、 Mongoid::SearchIndexable::Classメソッドs ドキュメントを参照してください。