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

MongoDBインデックス作成の内部実装?

    インデックスはRAMに格納されているという考えを持っていると思います。そうではないと言ったらどうでしょう。

    まず、インデックスとは何かを理解する必要があります。インデックスは基本的に、そのドキュメントがディスク上のどこにあるかを示すためのポインタです。本の索引付けと同じように、アクセスを高速化するために、どのトピックがどのページ番号にあるかを確認できます。

    したがって、インデックスが作成されると、それらもディスクに保存されますが、アプリケーションの実行中は、頻繁な使用とさらに高速なアクセスに基づいて、インデックスはRAMにロードされますが、ロードと作成には違いがあります。

    また、インデックスのロードは、コレクションまたはレコードのRAMへのロードと同じではありません。インデックスがロードされている場合、すべてのドキュメントをロードしてそれぞれを検証するのとは異なり、ディスクから取得するすべてのドキュメントがわかります。したがって、インデックスはコレクションスキャンを回避します。

    インデックスの作成は1回限りのプロセスですが、ドキュメントへの書き込みごとにインデックスが変更される可能性があるため、データの変更に基づいてレコードがシャッフルされる可能性があるため、一部を再計算する必要があります。そのため、インデックス作成により書き込みが遅くなり、読み取りが速くなります。

    もう一度本と考えてください。本の間にたとえば2ページの新しいトピックを追加する場合、そのトピック番号の後のすべてのインデックスを再計算する必要があります。によると。

    • いいえ、レコードはRAMに保存されません。このレコードを作成すると、コレクション内のすべてのドキュメントが処理され、インデックスシートが作成されます。ドキュメントが多すぎると、当然のことながら時間がかかります。そのため、バックグラウンドでインデックスを作成するオプション。
    • インデックスは一度作成されます。削除して再度作成できますが、アプリケーションまたはDBの再起動時に再作成されません。シャーディングされた環境での膨大なコレクションにとって、それは非常識です。
    • これも真実ではありません。 _idはインデックス付きフィールドとして提供されるため、書き込みを行うとインデックスが再計算されるため、空のコレクションに対してインデックスがすでに作成されています。一意のインデックスであるため、処理が高速になります。
    • すべてのレコードは、MongoDBのインメモリエンジンを使用している場合にのみRAMに保存されます。これは、エンタープライズエディションとして提供されていると思います。インデックスが作成されているため、レコードがRAMに自動的に読み込まれることはありません。


    1. MongoDB:コレクションを手動でロックおよびロック解除します

    2. マングース:ObjectIdへのキャストが値に対して失敗しました

    3. ExpressJSおよびNodeJSのMongooseからの応答オブジェクトのキーの並べ替え

    4. 10.XX.XX.28:6379でRedisに接続できませんでした:不明なエラー-SpringBatchまたはWindowsマシンからのアクセス中に