TLDR: Indexing is just a way of grouping documents, dividing collections into groups to speed up performance
概要
インデックスは検索と同様にクエリーパフォーマンスを向上します
MongoDBにおけるインデックスのアイデアは、本のインデックスと似ており、ページを見つけるスピードを向上させています。 MongoDB のインデックスはドキュメントを見つける速度を向上させます
インデックスはどのように機能するのか
まず、MongoDB でどのようにインデックスを宣言するかを理解しましょう
collectionName.createIndex({field:value}) //for creating indexcollectionName.dropIndex({field:value}) //for removing index
ここでフィールドはインデックスされる “fieldName” です。 「
インデックスの種類を定義します。1 や -1 は find() クエリのパフォーマンスを上げるのに対し、 “text” は検索に使われます。 昇順 = -1
さて、インデックスがどのように機能するかですが、
ユーザーのコレクションを想像してみてください。各ドキュメントはさまざまな情報を含んでおり、そのうちの1つはスコアです。
インデックスが存在しない場合、MongoDB は各ドキュメントを調べて、クエリしたドキュメントを見つけます。これはコレクション スキャンと呼ばれ、MongoDB ではこの略語として COLLSCAN (Relational Databases ではテーブル スキャンと呼ばれます) を使用しています。 これで、データベース全体をスキャンするのではなく、そのテーブルをスキャンするだけでよくなります。 これははるかに高速です。
インデックスは MongoDB がスキャンするデータセットを絞り込むのに役立ちます。 これはインデックススキャンと呼ばれ、MongoDB ではこの略語も IXNSCAN
ここで、スコアインデックスとそのマッピングを視覚的に表現してみましょう。
インデックス付きのフィールドとインデックスなしのフィールドの 2 つのクエリを比較することにより、自分で比較することができます
db.<collection name>.find(query).explain()
オブジェクトが返されます
オブジェクトが返された後、そのオブジェクトを削除します。winingPlan.ステージは、スキャンのタイプ COLLSCAN または IXNSCAN
を伝えますが、実行にかかった時間は伝えません
find
などのクエリーメソッドの前に explain(‘executionStat’) メソッドを使用します。
db.<collection name>explain('executionStat').find(query)
executionTimeMillis で実行時間がわかる
Downside of Index
Indexes are not free, インデックスには容量がかかる。 インデックスは読み込み速度を向上させますが、何かが書き込まれるたびに、インデックスを更新する必要があります。
B-Tree
インデックスはグループのテーブルではなく、概念的にはB-Tree (バイナリツリー) で、MongoDBだけでなくSQLデータベースでもインデックス作成にB-Treeを使っています
この動画はB-Treeについて最もよく説明しています