MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana hideIndex() Bekerja di MongoDB

MongoDB memperkenalkan db.collection.hideIndex() metode di MongoDB 4.4.

Metode ini menyembunyikan indeks yang ada dari perencana kueri. Ini memungkinkan Anda mengevaluasi dampak potensial dari penurunan indeks tanpa benar-benar menjatuhkan indeks.

Jika menyembunyikannya berdampak negatif, Anda dapat menggunakan db.collection.unhideIndex() untuk menampilkan indeks. Ini menyelamatkan Anda dari keharusan menjatuhkan indeks, lalu membuatnya kembali.

Contoh

Misalkan kita memiliki koleksi yang disebut pets . Mari kembalikan indeks saat ini pada koleksi itu.

db.pets.getIndexes()

Hasil:

[
	{
		"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"
	}
]

Kita dapat melihat bahwa ia memiliki tiga indeks. Mari kita pilih yang ketiga bernama idx_weight_-1 untuk contoh kita.

Pertama, mari kita lihat seperti apa rencana kueri saat menjalankan kueri yang menggunakan indeks itu.

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

Di sini, kami mencari hewan peliharaan yang beratnya lebih dari tertentu. Kami menggunakan explain() metode untuk menampilkan rencana kueri alih-alih hasil aktual.

Berikut tampilan rencana kueri untuk kueri ini:

{
	"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
}

Kita dapat melihat bahwa ia menggunakan IXSCAN yang berarti menggunakan index.

Sekarang mari kita sembunyikan indeksnya.

Sembunyikan Indeks

Di sinilah hideIndex() masuk. Kita dapat menggunakannya untuk menyembunyikan indeks sehingga tidak muncul pada rencana kueri seperti pada contoh sebelumnya.

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

Keluaran:

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

Keluaran dari hideIndex() metode menampilkan nilai lama untuk hidden bidang (dalam hal ini false ) dan nilai baru (dalam hal ini true ).

Namun, jika kami menyembunyikan indeks yang sudah disembunyikan (atau menampilkan yang sudah tidak disembunyikan), ini tidak akan ditampilkan, dan kami hanya mendapatkan yang berikut:

{ "ok" : 1 }

Bagaimanapun, indeks sekarang disembunyikan.

Periksa Ulang Paket Kueri

Mari kita jalankan kembali kueri sebelumnya untuk melihat seperti apa rencana kueri sekarang.

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

Hasil:

{
	"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
}

Kali ini kita mendapatkan COLLSCAN , yang berarti tidak menggunakan indeks – ia melakukan pemindaian koleksi.

Periksa Apakah Indeks Tersembunyi

Anda dapat menggunakan getIndexes() metode untuk memeriksa apakah suatu indeks disembunyikan atau tidak.

Jadi, kita dapat menjalankan kueri yang sama yang kita jalankan sebelumnya untuk mengembalikan semua indeks:

db.pets.getIndexes()

Hasil:

[
	{
		"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
	}
]

Tidak Dapat Menyembunyikan Indeks? Periksa Setelan ini.

mongod featureCompatibilityVersion minimal harus 4.4 sebelum Anda dapat menyembunyikan index. Namun, setelah disembunyikan, indeks akan tetap tersembunyi bahkan dengan featureCompatibilityVersion setel ke 4.2 pada binari MongoDB 4.4.

Anda dapat memeriksa featureCompatibilityVersion setting dengan kode berikut:

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

Anda dapat mengaturnya menggunakan setFeatureCompatibilityVersion perintah:

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

setFeatureCompatibilityVersion perintah harus dijalankan di admin basis data.

Perhatikan juga, Anda tidak dapat menyembunyikan _id indeks.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tutorial MongoDB untuk 2022 – Pelajari Apa itu MongoDB?

  2. Apa yang sebenarnya dimaksud dengan MongoDB yang tidak mematuhi ACID sebelum v4?

  3. MongoDB $pesanBoleh

  4. Mengkloning koleksi di MongoDB

  5. Mongoexport menggunakan batasan $gt dan $lt pada rentang tanggal