1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDBのインデックスを簡単に理解するために

2022-01-19 12:11:58

インデックス入門

インデックスを作成することで、文書の問い合わせ速度を向上させることができますが、インデックスを構築する過程で計算資源と記憶資源を必要とし、インデックスが既に確立されている状態で新しい文書を挿入すると、インデックスの順序が入れ替わる可能性があります。

MongoDBのインデックスは、B-treeというデータ構造とそれに対応するアルゴリズムに基づいています。ツリーインデックスには、特定のフィールドやフィールドのセットの値が、 フィールドの値でソートされて格納されています。インデックスエントリのソートは、効率的な等式マッチングと範囲ベースのクエリ操作をサポートします。

1. 構文の準備

  • explain() : 実行計画を表示します。
  • getIndexes(): すべてのインデックスを表示します
  • hint() : クエリに特定のインデックスを使用するように強制します。

2. データの準備

{
    "_id" : ObjectId("6127594238754d0067383ff6"),
    "xh" : 1,
    "szly" : {
        "lymc" : "AA Building",
        "z" : "A",
        "lh" : "1",
        "sy" : "What does it mean"
    },
    "qtxx" : {
        "nsssjg" : "A,in-district",
        "sfwkgh" : "No",
        "cylx" : "Tertiary",
        "rzlysj" : "2011.11",
        "fwcqdw" : "Henan Land ",
        "fwszlc" : "5",
        "fjh" : "601,604",
        "mj" : 56,
        "cyry" : 5,
        "yzj" : 2,
        "qylx" : "H, other",
        "ssqylx" : "C, unlisted",
        "lxr" : "AA Lan",
        "lxdh" : "85685685"
    },
    "sssq" : "Yuhong Building Community",
    "frxx" : {
        "qyfr" : "AAlan",
        "qyfzr" : "AA orchid",
        "lxfs" : "1888888888888"
    },
    "qyjbxx" : {
        "xy" : "P Education",
        "qymc" : "Zhengzhou Guancheng Hui Training School",
        "gsyyzzh" : "31313123",
        "swdjzh" : "123123123123",
        "tyxydm" : "313123123",
        "zcdz" : "Yuhong International Building A, 6th Floor",
        "jjxz" : "Limited Liability Company",
        "zczb" : 100
    },
    "importMonth" : "202108",
    "batch" : "1629968706400_1",
    "createBy" : "1",
    "department" : "district_government",
    "createTime" : ISODate("2021-08-26T09:05:06.416Z"),
    "status" : 0,
    "ddly" : {
        "zh" : "",
        "lh" : "",
        "sy" : ""
    },
    "lcxx" : {
        "zb" : "",
        "szlc" : "",
        "mj" : ""
    },
    "updateBy" : "1",
    "updateTime" : "2021-08-27 11:14:31"
}


3. インデックス

3.1 ユニーク・インデックス

 デフォルトのインデックスです。_id (ユニークインデックス)

 一意なインデックスは、そのインデックスに対応するキーが同じ値を持たないことを保証し、一意なインデックスがあるフィールドに重複するデータが書き込まれた場合には例外を投げます。

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1},{unique:true})


3.2 シングルキーインデックス

 最も一般的なインデックスで、自動的に作成されることはありません。

 シングルビルドインデックスの作成例

db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1})

db.getCollection("qydrmb_copy").createIndex({"qtxx.fwcqdw":1})



注意事項

  • qydrmb_copy: コレクション名
  • qtjbxx: コレクションのフィールド名
  • qtxx.fwcqdw: コレクション内のサブコレクションフィールドの名前
  • 1: 昇順ソート
  • -1:降順で並べ替える

3.3 マルチキーインデックス

 マルチキーインデックスは、シングルキーインデックスと同じ形式で作成されますが、違いは、フィールドの値が、複数のレコードを持つ、例えば、配列です

注)getIndexes()では、シングルキーインデックスかマルチキーインデックスかを区別することができないため、explain()実行プランのプリントアウトで確認できます(isMultKeyプロパティ)。

3.4 コンポジットインデックス

 複合インデックスは、複数のフィールドに対して共同でインデックスを作成し、最初のフィールドで最初にソートし、同じ最初のフィールドを持つドキュメントは2番目のフィールドでソートし、といった具合になります。

 構文

<ブロッククオート

db.collection_name.createIndex({index_key_name: sort_rule, index_key_name: sort_rule, ...})

 複合インデックスは、複数のフィールドを組み合わせたクエリだけでなく、インデックスプレフィックスに一致するすべてのクエリに対して、シングルフィールドインデックスよりも豊富なクエリシナリオを満たすことができます。

注:複合インデックスA、Bを作成します。クエリにAが含まれている場合、Bはインデックスされ、クエリにAが含まれている場合もインデックスされ、クエリにAがなく、Bだけがある場合は、インデックスされません。

3.5 クロスインデックス

 複数のフィールドをクエリ条件としてクエリを実行するために、コレクションの複数のフィールドが別々にインデックスされている状況、これをクロスインデックスと呼びます。

 クロスインデックスと複合インデックスの違い:クロスインデックスではAとBが2つのインデックスとなり、複合インデックスではAとBが1つのインデックスを形成する。

注:クロスインデックスA、Bを含むコレクションは、クエリ条件がAを含むか、Bを含むか、AおよびBを含む場合にクロスインデックスをトリガします。

3.6 部分的なインデックス作成

 パーシャルインデックスとは、特定の条件を満たした文書に対してインデックスを作成することで、バージョン3.2でのみサポートされた機能です。

 MongoDB の部分インデックスは、コレクションに含まれ、指定したフィルタ条件を満たすドキュメントに対してのみインデックスを作成します。簡単に言うと、部分インデックスとはフィルタを使ったインデックスのことで、 特定のドキュメントに対してのみインデックスが存在することを意味します。

構文

<ブロッククオート

db.collection_name.createIndex({index key name: sorting rule},{partialFilterExpression:{"the name of previous key to be sorting":{match condition: condition value}))

注:パーシャルインデックスはユニークと同時に使用され、ユニーク制約がフィルタリング条件を満たす文書にのみ適用されるようにします。

3.7 インデックスのオーバーライド

 1. すべてのクエリフィールドはインデックスの一部である

 2. クエリによって返されるすべてのフィールドは、同じインデックスにある

たとえば、インデックスに A と B という二つのフィールドがあり、クエリ条件に A が一つしかなく、A と B という二つのフィールドを返す場合、オーバーライドインデックスが発動され、ドキュメント全体をスキャンするのではなく、インデックスから直接データが取得されることになります。

3.8 フルテキストインデックス

 全文検索では、単語ごとに記事中の出現回数と位置を指定したインデックスを作成し、ユーザーが問い合わせると、検索プログラムはあらかじめ設定されたインデックスに従って検索を行い、検索結果をユーザーにフィードバックする検索方法を採用しています。

 MongoDBはバージョン2.4からフルテキスト検索をサポートしており、現在15言語(デンマーク語、オランダ語、英語、フィンランド語、フランス語、ドイツ語、ハンガリー語、イタリア語、ノルウェー語、ポルトガル語、ルーマニア語ロシア語、スペイン語、スウェーデン語、トルコ語)でフルテキストのインデックス化をサポートしています。

 mongo 2.6以降では、全文検索がデフォルトで有効になります。

作成構文です。

db.collection_name.ensureIndex({Field name of full-text index: "text"})

クエリーの構文

<ブロッククオート

db.collection_name.find({$text:{$search:"retrieved value"}})

4. インデックスに関する制限事項

4.1 クエリーの制限事項

  • 以下のクエリでは、インデックスを使用することはできません。
  • 正規表現(左端のマッチを除く)と、$nin、$not などの非演算子。
  • modなどの算術演算子。
  • explain()を使って、インデックスが実行されたかどうかを確認することができます

4.2 スコープの制限

  • 1セットのインデックス数は64個以下
  • インデックス名の長さが128文字を超えてはならない
  • 適合するインデックスは最大31のフィールドを持つことができる
  • インデックスのサイズはメモリの制限を超えることはできません。制限を超えると、Mongo は一部のインデックスを削除してしまい、パフォーマンスの低下を招く可能性があります。

概要

この記事は、MongoDBのインデックスに関するすべての簡単な理解であり、より関連するMongoDBのインデックスの簡単な理解の内容は、スクリプトハウスの過去の記事を検索してくださいまたは次の関連記事を閲覧し続けることは、今後、スクリプトハウスをよりサポートして願っています