
キーテイクアウト
MongoDBでのインデックス作成は、読み取る必要がある完全なドキュメントの数を減らしてアプリケーションのパフォーマンスを改善することにより、パフォーマンスとスループットを大幅に向上させることができます。
- MONGODBは、デフォルト_IDインデックス、セカンダリインデックス、複合インデックス、マルチキーインデックス、マルチキーコンパウンドインデックスなど、いくつかのタイプのインデックスをサポートしています。各タイプは特定の目的を果たし、さまざまなタイプのクエリに使用されます。
コレクションで複数のインデックスを定義できますが、クエリは実行中に1つのインデックスのみを使用できます。最適なインデックスは、Mongodbのクエリオプティマイザーによって実行時に選択されます。
- インデックス作成は読み取り操作を劇的に改善する可能性がありますが、独自のコストも発生します。インデックス作成操作はスペースを占有し、各挿入物に追加のオーバーヘッドを引き起こし、コレクションの操作を削除し、削除します。したがって、インデックス作成には、読み書きの多いコレクションが、書き込みが多いコレクションよりも多くなります
インデックス作成は、MongoDBとの作業のより重要な概念の1つです。インデックス作成は、読み取る完全なドキュメントの数を減らし、それによってアプリケーションのパフォーマンスを向上させることで、パフォーマンスとスループットを劇的に増加させる可能性があるため、適切な理解が重要です。インデックスを理解するのが少し難しい場合があるため、この2部構成のシリーズはそれらを詳しく見ていきます。
この記事では、次の5つのタイプのインデックスについて説明します。
-
デフォルト_IDインデックス-
セカンダリインデックス
複合指数-
マルチケイインデックス-
マルチケイコンパウンドインデックス-
議論する他のいくつかのタイプもありますが、私は論理的にパート2のためにそれらを維持し、明確な理解を提供し、混乱を避けます。
コレクションで複数のインデックスを定義できますが、クエリは実行中に1つのインデックスのみを使用できます。利用可能なオプションから最適なインデックスを選択する決定は、Mongodbのクエリオプティマイザーによって実行時に行われます。
この記事では、MongoDBの概念(コレクション、ドキュメントなどなど)を基本的に理解し、PHP(FindやInsertなど)を使用して基本的なクエリを実行することを前提としています。そうでない場合は、初心者の記事を読むことをお勧めします。MongodbとMongodbの紹介は再訪します。
シリーズでは、次の構造を持つ500のドキュメントが入力された投稿という名前のコレクションがあると想定します。
-
次に、さまざまなタイプのインデックス作成を詳細に調べてみましょう。
デフォルト_IDインデックス-
デフォルトでは、MongoDBは各コレクションの_IDフィールドにデフォルトインデックスを作成します。各ドキュメントには、一次キーとしての一意の_IDフィールド、12バイトのObjectIDがあります。利用可能なインデックスが他にない場合、これはデフォルトであらゆる種類のクエリに使用されます。
コレクションのインデックスを表示するには、Mongodbシェルを開き、次のことを実行します。
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
getIndexes()メソッドは、コレクションのすべてのインデックスを返します。ご覧のとおり、名前
_id_ のデフォルトインデックスがあります。重要なフィールドは、インデックスが_IDフィールドにあることを示し、1の値は昇順の順序を示します。次のセクションで注文について学びます。
セカンダリインデックス
_IDフィールド以外のフィールドでインデックス作成を使用する場合は、カスタムインデックスを定義する必要があります。 user_nameフィールドに基づいて投稿を検索するとします。この場合、コレクションのuser_nameフィールドにカスタムインデックスを定義します。このようなカスタムインデックスは、デフォルトのインデックス以外に、セカンダリインデックスと呼ばれます。
データベースに対するインデックスの効果を示すために、最初にインデックスを作成せずにクエリパフォーマンスを簡単に分析しましょう。このために、クエリを実行して、「Jim Alexandar」を搭載したuser_nameを備えたすべての投稿を見つけます。
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
インデックス作成でよく使用される重要な方法は、インデックスに関連する情報を返す説明()です。上記の説明()の出力は、以下に示すように、次のとおりです。

見る価値のある重要な鍵のいくつかは次のとおりです。
- カーソル - クエリで使用されるインデックスを示します。 basicCursorは、デフォルトの_IDインデックスが使用され、MongoDBがコレクション全体を検索する必要があることを示します。先に進むと、インデックス作成を適用すると、BASICCURSOR。
n - 返されたクエリのドキュメントの数を示します(この場合は1つのドキュメント)。
nscannedObjects - クエリで検索されたドキュメントの数を示します(この場合、コレクションの500のドキュメントはすべて検索されました)。これは、コレクション内のドキュメントの数が非常に大きい場合、大きな間接関係のある操作になる可能性があります。
nscanned - データベース操作中にスキャンされたドキュメントの数を示します。
-
理想的には、nはnscannedに等しい、またはそれに近い必要があります。これは、最小数のドキュメントが検索されたことを意味します。
次に、同じクエリを実行しますが、セカンダリインデックスを使用します。インデックスを作成するには、MongoDBシェルで以下を実行します。
-
user_nameフィールドにインデックスを作成しました
suresedex()メソッドを使用した投稿コレクション。検索の昇順(1)または下降(-1)のいずれかを示すメソッドへの注文引数の値をティーチしたと確信しています。これをよりよく理解するために、各ドキュメントにはタイムスタンプフィールドがあることに注意してください。最新の投稿が最初に必要な場合は、降順注文を使用します。最初に最古の投稿では、昇順の注文を選択します。
インデックスを作成した後、同じfind()と説明()メソッドを使用して、以前と同じようにクエリを実行および分析します。の出力:
-
出力は、クエリがA
btreecursor user_name_1(以前に定義した)を使用し、インデックスなしで前のクエリで検索した500のドキュメントとは対照的に、1つのドキュメントのみをスキャンしたことを示しています。
今のところ、すべてのMongoDBインデックスがアルゴリズムでBTreeデータ構造を使用していることを理解し、Btreecursorがそのためのデフォルトカーソルであることを理解してください。 Btreecursorの詳細な議論は、この記事の範囲外ですが、これはそれ以上の理解には影響しません。
上記の比較は、インデックスがクエリパフォーマンスを劇的に改善する方法を示しています。
複合指数
クエリが複数のフィールドを使用する場合があります。そのような場合、複合インデックスを使用できます。 POST_TYPEとPOST_LIKESフィールドの両方を使用する次のクエリを検討してください。
このクエリを説明()で分析すると、次の結果が得られます。これは、クエリがBasicCursorを使用し、500のドキュメントすべてがスキャンされて1つのドキュメントを取得することを示しています。
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
これは非常に非効率的なので、いくつかのインデックスを適用しましょう。次のように、フィールドpost_typeおよびpost_likesの複合インデックスを定義できます。
クエリを分析すると、次の結果が得られます。
ここでの非常に重要な点は、複数のフィールドで定義されている複合インデックスを使用して、これらのフィールドのサブセットを照会できることです。たとえば、複合インデックスがあると仮定します{field1、field2、field3}。このインデックスは、次のクエリに使用できます。
field1 -
field1、field2-
field1、field2、field3-
したがって、インデックス{field1、field2、field3}を定義した場合、個別の{field1}および{field1、field2}インデックスを定義する必要はありません。ただし、Field2とField2、Field3を照会しながらこの複合インデックスが必要な場合、Optimizerが目的のインデックスを選択しない場合は、hint()を使用できます。
Hint()メソッドを使用して、MongoDBに指定し、デフォルトの選択とクエリの最適化プロセスをオーバーライドするインデックスを使用するように強制できます。以下に示すように、インデックスで使用されているフィールド名を引数として指定できます。
これにより、クエリがPOST_TYPEおよびPOST_LIKESフィールドで定義された複合インデックスを使用します。
<span><span><?php
</span></span><span><span>// query to find posts with user_name "Jim Alexandar"
</span></span><span><span>$cursor = $collection->find(
</span></span><span> <span>array("user_name" => "Jim Alexandar")
</span></span><span><span>);
</span></span><span><span>// use explain() to get explanation of query indexes
</span></span><span><span>var_dump($cursor->explain());</span></span>
マルチケイインデックス
アレイフィールドでインデックスが作成されると、マルチキーインデックスと呼ばれます。もう一度投稿文書を検討してください。 post_tagsにマルチキーインデックスを適用できます。 Multikey Indexは配列の各要素をインデックスするため、この場合、post_Tags値に対して個別のインデックスが作成されます:
mongodb 、チュートリアル、indexing、および、およびすぐ。

ただし、各値のインデックス作成のために多くのメモリを消費するため、配列フィールドのインデックスは非常に選択的に使用する必要があります。
マルチケイコンパウンドインデックス
マルチキーコンパウンドインデックスを作成できますが、インデックス内の最大1つのフィールドが配列になる可能性があるという制限があります。したがって、文字列としてfield1を、[field2、field3]を配列として持っている場合、両方のフィールドが配列であるため、インデックス{field2、field3}を定義することはできません。
以下の例では、post_tagsとuser_nameフィールドにインデックスを作成します。

インデックス作成の制限と考慮事項
正規表現、否定演算子(すなわち$ ne、$ notなど)、算術演算子(すなわち$ modなど)、$のjavascript式を使用するクエリではインデックス作成を使用できないことを知ることが重要です。条項、および他のいくつかの場合。
インデックス操作には、独自のコストも伴います。各インデックスはスペースを占有するだけでなく、各挿入に追加のオーバーヘッドを引き起こし、コレクションの操作を削除し、削除します。各コレクションの読み取り比を考慮する必要があります。インデックス作成は、読みやすいコレクションにとって有益ですが、書き込みが多いコレクションには適していない場合があります。
MongodbはRAMにインデックスを保持します。合計インデックスサイズがRAMの制限を超えないことを確認してください。もしそうなら、一部のインデックスはRAMから削除されるため、クエリは遅くなります。また、コレクションには最大64のインデックスがあります。
要約
これがすべてです。要約すると、適切なインデックス作成アプローチが選択されている場合、インデックスはアプリケーションに非常に有益です。次のパートでは、埋め込まれたドキュメント、サブドキュメント、および注文にインデックスを使用することを検討します。乞うご期待!
Fotoliaを介した画像
mongodbインデックスングに関するよくある質問
データベース管理におけるMongoDBインデックスの重要性は何ですか?
MongoDBインデックスは、データベース管理の重要な側面です。データへのより効率的なパスを提供することにより、データベース操作のパフォーマンスが大幅に向上します。インデックスがないと、MongoDBはコレクションスキャン、つまり、クエリステートメントに一致するドキュメントを選択するために、コレクションのすべてのドキュメントをスキャンする必要があります。インデックスを使用すると、MongoDBは検索をデータの関連部分に制限し、スキャンするのに必要なデータの量を減らすことができます。これにより、応答時間が速くなり、CPUの使用量が削減されます。これは、大規模なデータベースで特に有益です。 MongoDBインデックス作成はどのように機能しますか?
MongoDBインデックス作成は、コレクションのデータのごく一部を保持する特別なデータ構造を作成することで機能します。このデータ構造には、インデックスで指定されているフィールドの値によって順序付けられる特定のフィールドまたはフィールドのセットの値が含まれます。クエリが実行されると、MongoDBはこれらのインデックスを使用して、検査する必要があるドキュメントの数を制限します。インデックスは、ドキュメントの合計サイズが利用可能なRAMを超える場合に特に有益です。クエリのパフォーマンス。これらには、単一のフィールド、化合物、マルチケイ、テキスト、2D、および2DSphereインデックスが含まれます。各タイプのインデックスは特定の目的を果たし、さまざまなタイプのクエリに使用されます。たとえば、単一のフィールドと複合インデックスは、それぞれ単一または複数のフィールドのクエリに使用されます。マルチキーインデックスは配列に使用され、テキストインデックスは文字列コンテンツに使用されます。 。このメソッドは、インデックスがまだ存在しない場合、指定されたフィールドにインデックスを作成します。このメソッドには、インデックスするフィールドまたはフィールドと追加のオプションを指定できるオプションドキュメントの2つのパラメーターが必要です。
mongodbで複数のインデックスを作成できますか? Mongodbのインデックス。ただし、インデックスはクエリパフォーマンスを改善しますが、システムリソース、特にディスクスペースとメモリも消費することに注意することが重要です。したがって、頻繁に照会されるフィールドでのみインデックスを作成することが重要です。 MongoDBは、アプリケーションのクエリパターンに大きく依存しています。ソート操作で頻繁に照会または使用されるフィールドは、インデックス作成の良い候補です。さらに、クエリを実行するときにMongoDBがスキャンする必要があるドキュメントの数を大幅に削減できるため、高度な一意性を持つフィールドはインデックス作成の良い候補でもあります。
getIndexes()メソッドを使用してMongoDBにインデックスが存在するかどうかを確認できます。このメソッドは、デフォルトで作成された_IDインデックスを含むコレクション上のすべてのインデックスのリストを返します。 dropindex()メソッドを使用したmongodb。このメソッドは、指定されたインデックスをコレクションから削除します。
mongodbのインデックス交差とは何ですか?
インデックス交差点は、データベースが複数のインデックスを使用してクエリを満たすことができるMongoDBの機能です。 。これは、単一のインデックスがクエリを満たすことができない場合に特に役立ちますが、2つ以上のインデックスの交差点では。
MongoDBでの書き込み操作に対するインデックス作成の影響は何ですか?
インデックス作成により、読み取り操作のパフォーマンスが大幅に向上しますが、書き込み操作に影響を与える可能性があります。これは、ドキュメントが挿入または更新されるたびに、コレクション上のすべてのインデックスも更新する必要があるためです。したがって、コレクションのインデックスが多いほど、書き込み操作が遅くなります。インデックスを作成するときに読み取りパフォーマンスと書き込みパフォーマンスのバランスを見つけることが重要です。
以上がPHPマスター| MongoDBインデックス、パート1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。