Sorgu performansını optimize etme

Yavaş sorgularla ilgili sorunları gidermek için Sorgu Açıklama'yı kullanarak sorgu yürütme planını ve çalışma zamanı yürütme profilini alın. Aşağıdaki bölümde, yürütme profiline bağlı olarak sorgu performansını optimize etmek için uygulayabileceğiniz adımlar açıklanmaktadır:

Sonuç sayısını sınırlama

Sorgunun çok sayıda belge döndürüp döndürmediğini belirlemek için yürütme ağacındaki döndürülen kayıtlar alanını kullanın. $limit ifadesini kullanarak döndürülen doküman sayısını sınırlayabilirsiniz. Bu, sonuçlar ağ üzerinden istemcilere döndürüldüğünde sonuçların serileştirilmiş bayt boyutunu azaltır. Limit düğümünden önce bir MajorSort düğümü geliyorsa sorgu motoru, Limit ve MajorSort düğümlerini birleştirebilir ve tam bellek içi somutlaştırma ve sıralamayı TopN sıralamasıyla değiştirerek sorgu için bellek gereksinimini azaltabilir.

Sonuç dokümanının boyutunu sınırlama

Gereksiz alanların getirilmesini önlemek için $project ifadesini kullanarak döndürülen belgenin boyutunu sınırlayabilirsiniz. Bu sayede, ara sonuçları işlemek için gereken işlem ve bellek maliyeti ile sonuçlar ağ üzerinden istemcilere döndürülürken sonuçların serileştirilmiş bayt boyutu azalır. Sorguda başvurulan tüm alanların normal bir dizin (çoklu anahtar değil) tarafından kapsandığı durumlarda bu, sorgunun dizin taraması tarafından tamamen kapsanmasına olanak tanır ve birincil depolama alanından belge getirme ihtiyacını ortadan kaldırır.

Dizinleri kullanma

Dizinleri oluşturmak ve optimize etmek için aşağıdaki talimatları uygulayın.

Sorgunun dizin kullanıp kullanmadığını belirleme

Yürütme ağacındaki yaprak düğümleri kontrol ederek sorgunun bir dizin kullanıp kullanmadığını belirleyebilirsiniz. Yürütme ağacının yaprak düğümü bir TableScan düğümü ise sorgu bir dizin kullanmıyor ve birincil depolama alanındaki belgeleri tarıyor demektir. Bir dizin kullanılıyorsa yürütme ağacının yaprak düğümü, dizinin dizin kimliğini ve dizin alanlarını gösterir.

Kullanılan dizinin optimize edilip edilemeyeceğini belirleme

Dizin, sorgu motorunun birincil depolama alanından getirmesi gereken belge sayısını azaltabiliyorsa veya alan sıralaması sorgunun sıralama şartını karşılayabiliyorsa sorgu için kullanışlıdır.

Sorgu için bir dizin kullanılıyorsa ancak sorgu motoru hâlâ birçok belgeyi getirip atıyorsa (bu durum, birçok kayıt döndüren bir Tarama düğümü ve ardından birkaç kayıt döndüren bir Filtre düğümü ile tanımlanır) bu, dizin kullanılarak karşılanan sorgu yükleminin seçici olmadığını gösterir. Daha uygun bir dizin oluşturmak için Dizin oluşturma başlıklı makaleyi inceleyin.

Sorgu için çoklu anahtar olmayan bir dizin kullanılıyorsa ancak sorgu motoru, sorgu yürütme ağacındaki bir MajorSort düğümü tarafından tanımlandığı şekilde sonuç kümesini bellekte yeniden sıralamaya devam ediyorsa bu durum, kullanılan dizinin sorgunun sıralama şartını karşılamak için kullanılamayacağını gösterir. Daha uygun bir dizin oluşturmak için sonraki bölüme bakın.

$lookup sorgu optimize ediliyor

from koleksiyonuna dizinler ekleyerek $lookup sorgularını optimize edebilirsiniz. Bu sayede işlem, tüm koleksiyonu taramadan eşleşen dokümanları verimli bir şekilde bulabilir.

$lookup, şununla: localField ve foreignField

$lookup aşamasında localField ve foreignField seçeneklerini kullanıyorsanız from koleksiyonundaki foreignField için bir dizin oluşturun.

İç içe yerleştirilmiş ardışık düzenler içeren $lookup

$match aşamalarıyla $lookup aşamasında pipeline seçeneğini kullanıyorsanız tam koleksiyon taramasını önlemek için yabancı koleksiyondaki alanlarda bir dizin oluşturun:

  • Filtre semantiği içeren $match aşamaları (ör. {$match: {a: true}}) için yabancı koleksiyondaki (a) ilgili alanlarda bir dizin oluşturun.
  • Bir alanı sabit bir değerle (ör. {$match: {$expr: {$gt: [a, 10]}}}) karşılaştıran toplama semantiğine sahip $match aşamaları veya let içinde tanımlanan alanlar ile değişkenler arasında eşitlik karşılaştırmaları (eq veya in) (ör. {$match: {$expr: {$eq: [a, "$$a"]}}}) için yabancı koleksiyondaki alanlarda bir dizin oluşturun. Planlamada çoklu anahtar dizininin kullanılmayacağını unutmayın.

Dizin oluşturma

Dizin oluşturmak için dizin yönetimi belgelerini inceleyin. Sorgunuzun dizinleri kullanabilmesi için aşağıdaki sırayla alanlar içeren normal (çoklu anahtar olmayan) dizinler oluşturun:

  1. Eşitlik operatörlerinde kullanılacak tüm alanlar. Sorgular arasında yeniden kullanım şansını en üst düzeye çıkarmak için alanları, sorgular arasındaki eşitlik operatörlerinde alanların oluşma sırasına göre azalan düzende sıralayın.
  2. Sıralanacak tüm alanlar (aynı sırada).
  3. Sorgu kısıtlaması seçiciliğinin azalan sırasına göre aralık veya eşitsizlik operatörlerinde kullanılacak alanlar.
  4. Dizindeki bir sorgunun parçası olarak döndürülecek alanlar: Bu tür alanların dizine eklenmesi, dizinin sorguyu kapsamasını sağlar ve birincil depolama alanından belge getirme ihtiyacını ortadan kaldırır.

Dizi alanlarını filtreleme ve sıralama içeren sorgular için çoklu anahtar dizinleri oluşturabilirsiniz.

Sorgu ipucunu kullanma

Sorgu için daha uygun bir dizin oluşturduysanız ancak sorgu motoru bu dizini kullanmıyorsa sorgu ipucu kullanarak sorgu motorunun dizin tercihini geçersiz kılabilirsiniz.

Query Explain ile yürütülen bir sorgunun çıkışı hakkında daha fazla bilgi için Sorgu yürütme referansı başlıklı makaleyi inceleyin.