sql >> データベース >  >> NoSQL >> MongoDB

MongoDB / Mongooseインデックスはクエリを速くしますか、それとも遅くしますか?

    あなたはそれを間違って読んでいます

    <について、引用されたブロックの意図を誤解しています。 code> .ensureIndex() (現在は非推奨ですが、マングースコードによって呼び出されます)実際には、このコンテキストで実行されます。

    マングースでは、設計に応じてスキーマレベルまたはモデルレベルでインデックスを定義します。マングースが「自動的に」行うことは、接続時に登録された各モデルに影響を与え、適切な .ensureIndex()を呼び出すことです。 提供されるインデックス定義のメソッド。

    これは実際に何をしますか?

    ほとんどの場合、アプリケーションを以前に起動した後、 .ensureIndexes() 実行されたメソッドは絶対に何もありません 。それは少し誇張されていますが、多かれ少なかれ真実です。

    インデックス定義はサーバーコレクションにすでに作成されているため、後続の呼び出しは何もしません。つまり、インデックスを削除して「再作成」することはありません。したがって、インデックス自体が作成されると、実際のコストは基本的にゼロになります。

    インデックスの作成

    つまり、mongooseは標準APIの上の単なるレイヤーであるため、createIndex() メソッドには、起こっていることのすべての詳細が含まれています。

    ここで考慮すべき詳細がいくつかあります。たとえば、インデックスビルドは「バックグラウンド」で発生する可能性があり、これはアプリケーションへの影響は少ないものの、自己負担で発生します。特に、「バックグラウンド」生成からのインデックスサイズは、フォアグラウンドで作成した場合よりも大きくなり、他の操作をブロックします。

    また、すべてのインデックスには、特にディスク使用量と、コレクションデータ自体の外部に追加情報を書き込むための追加コストの点でコストがかかります。

    インデックスの利点は、コレクション全体を検索して可能な条件に一致させるよりも、インデックスに含まれる値を「検索」する方がはるかに高速であるということです。

    これらは、インデックスに関連する基本的な「トレードオフ」です。

    展開パターン

    引用ブロック に戻る ドキュメントから、このアドバイスの背後にある本当の意図があります。

    展開パターン、特にデータ移行では、次の順序で実行するのが一般的です。

    1. 関連するコレクション/テーブルにデータを入力する
    2. ニーズに関連するコレクション/テーブルデータのインデックスを有効にする

    これは、インデックスの作成にコストがかかるためです。前述のように、インデックスビルドから最適なサイズを取得し、各ドキュメントの挿入にインデックスエントリの書き込みのオーバーヘッドが発生しないようにすることが望ましいためです。この「ロード」をまとめて実行します。

    それがインデックスの目的であり、それらはコストとメリットであり、マングースのドキュメントのメッセージが説明されています。

    ただし、一般的には、データベースインデックス を読むことをお勧めします。 彼らが何であるか、そして彼らが何をするかについて。本を見つけるために図書館に足を踏み入れることを考えてみてください。入り口にはカードインデックスがあります。図書館を歩き回って、欲しい本を見つけますか?それとも、カードインデックスで調べて、どこにあるかを調べますか?このインデックスは、作成と更新に時間がかかりましたが、本を見つけるためだけに、ライブラリ全体を歩き回る時間を節約できます。



    1. コマンドラインからHerokuがホストするRedisに安全に接続するにはどうすればよいですか?

    2. $ lookupの外部フィールドは、ネストされたドキュメントのフィールドである可能性がありますか?

    3. MongoDbは、Robomongoを使用してdateTimes間のネストされた配列を検索します

    4. PHPでMongoDBforeachクエリをコーディングする方法