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

MongoDBでhideIndex()がどのように機能するか

    MongoDBはdb.collection.hideIndex()を導入しました MongoDB4.4のメソッド。

    このメソッドは、クエリプランナーから既存のインデックスを非表示にします。これにより、実際にインデックスを削除せずに、インデックスを削除した場合の潜在的な影響を評価できます。

    非表示にすると悪影響がある場合は、db.collection.unhideIndex()を使用できます。 インデックスを再表示します。これにより、インデックスを削除してから再作成する必要がなくなります。

    petsというコレクションがあるとします。 。そのコレクションの現在のインデックスを返しましょう。

    db.pets.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"name" : 1,
    			"type" : -1
    		},
    		"name" : "idx_name_1_type_-1"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"weight" : -1
    		},
    		"name" : "idx_weight_-1"
    	}
    ]

    3つのインデックスがあることがわかります。 idx_weight_-1という3番目のものを選択しましょう この例では。

    まず、そのインデックスを使用するクエリを実行すると、クエリプランがどのようになるかを見てみましょう。

    db.pets.find( { weight: { $gt: 10 } } ).explain()

    ここでは、特定の体重を超えるペットを探しています。 explain()を使用しています 実際の結果の代わりにクエリプランを表示する方法。

    このクエリのクエリプランは次のようになります。

    {
    	"queryPlanner" : {
    		"plannerVersion" : 1,
    		"namespace" : "PetHouse.pets",
    		"indexFilterSet" : false,
    		"parsedQuery" : {
    			"weight" : {
    				"$gt" : 10
    			}
    		},
    		"queryHash" : "CEB852E7",
    		"planCacheKey" : "851FBDB5",
    		"winningPlan" : {
    			"stage" : "FETCH",
    			"inputStage" : {
    				"stage" : "IXSCAN",
    				"keyPattern" : {
    					"weight" : -1
    				},
    				"indexName" : "idx_weight_-1",
    				"isMultiKey" : false,
    				"multiKeyPaths" : {
    					"weight" : [ ]
    				},
    				"isUnique" : false,
    				"isSparse" : false,
    				"isPartial" : false,
    				"indexVersion" : 2,
    				"direction" : "forward",
    				"indexBounds" : {
    					"weight" : [
    						"[inf.0, 10.0)"
    					]
    				}
    			}
    		},
    		"rejectedPlans" : [ ]
    	},
    	"ok" : 1
    }

    IXSCANを使用していることがわかります これは、インデックスを使用したことを意味します。

    それでは、インデックスを非表示にしましょう。

    インデックスを非表示にする

    ここでhideIndex() 前の例のようにクエリプランに表示されないように、インデックスを非表示にするために使用できます。

    db.pets.hideIndex("idx_weight_-1")

    出力:

    { "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

    hideIndex()の出力 メソッドは、hiddenの古い値を表示します フィールド(この場合はfalse )と新しい値(この場合はtrue

    ただし、すでに非表示になっているインデックスを非表示にした場合(または、すでに非表示になっていないインデックスを再表示した場合)、これらは表示されず、次のようになります。

    { "ok" : 1 }

    いずれの場合も、インデックスは非表示になります。

    クエリプランを再確認する

    前のクエリを再実行して、クエリプランが現在どのようになっているのかを確認しましょう。

    db.pets.find( { weight: { $gt: 10 } } ).explain()

    結果:

    {
    	"queryPlanner" : {
    		"plannerVersion" : 1,
    		"namespace" : "PetHouse.pets",
    		"indexFilterSet" : false,
    		"parsedQuery" : {
    			"weight" : {
    				"$gt" : 10
    			}
    		},
    		"queryHash" : "CEB852E7",
    		"planCacheKey" : "851FBDB5",
    		"winningPlan" : {
    			"stage" : "COLLSCAN",
    			"filter" : {
    				"weight" : {
    					"$gt" : 10
    				}
    			},
    			"direction" : "forward"
    		},
    		"rejectedPlans" : [ ]
    	},
    	"ok" : 1
    }

    今回はCOLLSCANを取得します 、つまり、インデックスを使用せず、コレクションスキャンを実行しました。

    インデックスが非表示になっているかどうかを確認する

    getIndexes()を使用できます インデックスが非表示になっているかどうかを確認するメソッド。

    したがって、前に実行したのと同じクエリを実行して、すべてのインデックスを返すことができます。

    db.pets.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"name" : 1,
    			"type" : -1
    		},
    		"name" : "idx_name_1_type_-1"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"weight" : -1
    		},
    		"name" : "idx_weight_-1",
    		"hidden" : true
    	}
    ]

    インデックスを非表示にできませんか?この設定を確認してください。

    mongod featureCompatibilityVersion 少なくとも4.4である必要があります インデックスを非表示にする前に。ただし、一度非表示にすると、featureCompatibilityVersionを使用してもインデックスは非表示のままになります MongoDB4.4バイナリでは4.2に設定されています。

    featureCompatibilityVersionを確認できます 次のコードで設定します:

    db.adminCommand( 
        { 
            getParameter: 1, 
            featureCompatibilityVersion: 1 
        } 
    )

    setFeatureCompatibilityVersionを使用して設定できます コマンド:

    db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

    setFeatureCompatibilityVersion コマンドはadminで実行する必要があります データベース。

    また、_idを非表示にすることはできません。 インデックス。


    1. Redisサーバーで利用可能な合計接続数または最大接続数はいくつですか?

    2. Ubuntu20.04にApacheCouchDBをインストールする方法

    3. mongodb集約フレームワークの結果を新しいコレクションにエクスポートします

    4. Redis-スレーブを手動でマスターに昇格させる