Bu bölüm, MongoDB sorgu performans analizini tanıtıyor. SQL'in explain benzeri, MongoDB de sorgu ifadelerinin performansını analiz etmek için explain'i destekler.

Temel Kullanım

explain fonksiyonunu çağırarak analiz sonucunu elde edebilirsiniz

// find metodunun analiz sonucu
db.collection.find({}).explain();

// aggregate metodunun analiz sonucu
db.collection.explain().aggregate([]);

explain'in üç modu vardır:

  • queryPlanner (varsayılan)
  • executionStats
  • allPlansExecution

Açıklama:

  • queryPlanner kullanarak sadece tüm olası yürütme planlarını listeler, gerçek ifadeyi yürütmez ve zaten kazanmış olan winningPlan planını görüntüler.
  • executionStats kullanarak sadece winningPlan planını yürütür ve sonucu çıktılar.
  • allPlansExecution kullanarak tüm planları yürütür ve sonuçları çıktılar.

Farklı modların kullanımı

// executionStats modu, sadece parametreleri explain fonksiyonuna iletmek
db.collection.find({}).explain('executionStats');

// allPlansExecution modu
db.collection.find({}).explain('allPlansExecution');

explain içeriğinin açıklanması

queryPlanner İçeriği

Aşağıdaki içerik, explain tarafından varsayılan olarak döndürülen içeriktir, anahtar olmayan bilgileri yok sayar

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // Anahtar metrik, index filtreleme verisi kullanılıp kullanılmadığı
		"winningPlan" : {
			"stage" : "COLLSCAN",  // Anahtar metrik, stage aşama adı. Her aşamanın aşama özgü bilgileri vardır, örn., COLLSCAN tüm koleksiyon içeriğinin taranmasını temsil eder
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

Aşama aşama tipleri aşağıdaki gibidir:

  • COLLSCAN: Tam tablo taraması
  • IXSCAN: İndeks taraması
  • FETCH: İndekse dayalı belirli belgeleri alma
  • SHARD_MERGE: Her shard tarafından döndürülen verilerin birleştirilmesi
  • SORT: Bellekte sıralama yapılmasını gösterir
  • LIMIT: İadelerin sayısını sınırlama
  • SKIP: Kullanımı atla
  • IDHACK: _id için sorgu
  • SHARDING_FILTER: mongos üzerinden shard verilerini sorgulama
  • COUNT: db.coll.explain().count() veya benzeri için sayım işlemleri
  • COUNTSCAN: Sayım için bir indeksi kullanmadan dönen aşama
  • COUNT_SCAN: Sayım için bir indeksi kullanan aşama
  • SUBPLA: İndeks kullanılmayan $or sorguları için dönen aşama
  • TEXT: Tam metin indeksleri kullanılarak sorgulama yapıldığında dönen aşama
  • PROJECTION: İade edilen alanları sınırlandırmak için dönen aşama

executionStats İçeriği

Aşağıdaki içerik, executionStats modunda dönen içeriktir, anahtar olmayan bilgileri yok sayar

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // İade edilen belge sayısı
		"executionTimeMillis" : 0, // Yürütme süresi
		"totalKeysExamined" : 0, // Kaç indeks tarandı
		"totalDocsExamined" : 5, // Taranan belgelerin toplam sayısı
		"executionStages" : {
			"stage" : "COLLS CAN", // Aşama türü, COLLSCAN tüm tabloyu taradığını belirtir
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

Sorgu Optimizasyon Fikirleri

  • Mümkün olduğunca indeksleri kullanın
  • Taranan belge sayısı ne kadar az olursa, o kadar iyi olur