Mongodb:マルチキーインデックス構造?
-
29-10-2019 - |
質問
MongodbのMultikeysでどのように正確にインデックス作成が行われるかを理解するのは難しいと感じています。
これは、そのウェブサイトでMongodb DocsのMultikeysについて読んだことです。
1)「配列要素インデックスにインデックスを作成すると、データベースが配列の各要素をインデックスすることになります」
2)「...ドキュメント上のすべてのタグにインデックスを付け、「x」、「y」、「z」のインデックスエントリを作成します。
それでは、そのドキュメントのインデックスエントリとはどういう意味ですか?各ドキュメントはエントリを覚えていますか?その場合、検索は完全なテーブルスキャンになりますか?または、各インデックスエントリがそれぞれの発生ごとに複数のドキュメントを指しているMySQLのBツリーインデックスと同じです。その場合、私はあまりにも考えすぎています。
例を見てみましょう:
obj1 = {
name: "Apollo",
text: "Some text about Apollo moon landings",
tags: [ "moon", "apollo", "spaceflight", "nasa" ]
}
obj2 = {
name: "Atlantis",
text: "Some text about Atlantis flight missions",
tags: [ "space", "atlantis", "spaceflight", "nasa" ]
}
>db.articles.ensureIndex( { tags : 1 } )
私が理解するのを手伝ってください!前もって感謝します。
解決
この場合、あなたのインデックス(これはBツリー)が次のようになります。
apollo => [ obj1 ]
atlantis => [ obj2 ]
moon => [ obj1 ]
nasa => [ obj1, obj2 ]
space => [ obj2 ]
spaceflight => [ obj1, obj2 ]
これは、すべてのドキュメントが複数回表示できることを除いて、「通常の」Bツリーインデックスにすぎません(すべての一意のタグ値に対して1回表示される)。
他のヒント
マルチインデックスと複合インデックスの違いを誤解したと思います。
複合インデックスは、複数のフィールドのユーザー定義インデックスです。マルチキーインデックス:MongoDBインデックスがリリースされるフィールドが配列であるかどうかを判断し、たとえば各配列要素のインデックスを作成します。
db.user.ensureIndex({"address.street":1});
この場合、およびターゲットフィールドが配列であるため、インデックスはすべてのアイテムを1回だけ保存します。
mongodbの単純なIMDEXタイプについて疑問を明確にするこのシンプルなarticlwを見てみてください。 http://mongodbspain.com/en/2014/01/24/mongodb-indexes-part1/
よろしく、