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

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

В MongoDB, 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",
		"hidden" : true
	}
]

Виждаме, че има три индекса. Третият е скрит. Знаем това, защото има "hidden" : true .

Този индекс е на weight поле. Когато изпълняваме заявка през плана на заявката, който отправя заявка за weight поле, ще видим, че не използва индекса.

Пример:

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 (сканиране на колекция), което означава, че не е използвал индекса.

Показване на индекса

Можем да използваме unhideIndex() метод за разкриване на индекса. Този метод приема името на индекса или неговия ключов модел като параметър, за да посочи кой индекс да се покаже.

Пример:

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

Изход:

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

Резултатът от unhideIndex() method показва старата стойност за hidden поле (в този случай true ) и новата стойност (в този случай false ).

Ако обаче разкрием вече нескрит индекс (или скрием вече скрит), те не се показват и просто получаваме следното:

{ "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" : "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 , което означава, че е използвал индекса.

Проверете дали индексът е бил разкрит

Можем да използваме 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 .

Но също така не виждаме "hidden" : false .

Разкриването на индекс просто премахва "hidden" : true част от резултата от getIndexes() . hidden опцията е налична само ако стойността е true . hidden опцията е булева стойност, така че можем да заключим, че ако не е "hidden" : true , тогава е "hidden" : false .

Не можете да скриете/покажете индекси? Проверете тази настройка.

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. Сериализирайте един клас по два различни начина с Джаксън

  2. Mongoose - валидиране на синтаксиса на имейла

  3. Планирайте работата на Node.js на всеки пет минути

  4. spring-data-mongo - незадължителни параметри на заявката?

  5. Прозрачен отказ на база данни за вашите приложения