MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как работи hideIndex() в MongoDB

MongoDB въведе db.collection.hideIndex() метод в MongoDB 4.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"
	}
]

Виждаме, че има три индекса. Нека изберем третия, наречен idx_weight_-1 за нашия пример.

Първо, нека видим как изглежда планът на заявката, когато изпълняваме заявки, които използват този индекс.

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() method показва старата стойност за 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 зададен на 4.2 на MongoDB 4.4 двоични файлове.

Можете да проверите featureCompatibilityVersion настройка със следния код:

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

Можете да го настроите с помощта на setFeatureCompatibilityVersion команда:

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

setFeatureCompatibilityVersion командата трябва да се изпълни в admin база данни.

Също така имайте предвид, че не можете да скриете _id индекс.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да разположите Open edX MongoDB база данни за висока наличност

  2. MongoDB $isoDayOfWeek

  3. Геопространствена поддръжка в MongoDB

  4. Мангуста - Как да групирате и попълвате?

  5. Автоматизиране и управление на MongoDB в облака