Yavaş sorgularla ilgili sorunları gidermek için Sorgu Açıklaması'nı kullanarak sorgu yürütme planını ve çalışma zamanı yürütme profilini elde edin. 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 doküman 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 belge sayısını sınırlamayı deneyin. 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 MajorSort düğümü olduğu durumlarda sorgu motoru, Limit ve MajorSort düğümlerini birleştirebilir ve tam bellek içi somutlaştırma ile sıralamayı TopN sıralamasıyla değiştirerek sorgu için gereken bellek miktarını azaltır.
Sonuç Belgesinin Boyutunu Sınırlama
Gereksiz alanların getirilmesini önlemek için $project
yan tümcesini kullanarak döndürülen dokümanın boyutunu sınırlayabilirsiniz. Bu, ara sonuçların işlenmesiyle ilgili işlem ve bellek maliyetini azaltmaya yardımcı olur. Ayrıca, sonuçlar ağ üzerinden istemcilere döndürüldüğünde sonuçların seri hale getirilmiş bayt boyutunu da azaltır. Sorguda referans verilen tüm alanların normal bir dizin (çok anahtarlı olmayan) tarafından kapsandığı durumlarda bu, sorgunun dizin taraması tarafından tamamen kapsanmasına da olanak tanır ve dokümanların birincil depolamadan getirilmesi 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
Sorgunun dizin kullanıp kullanmadığını, yürütme ağacındaki yaprak düğümleri kontrol ederek belirleyebilirsiniz. Yürütme ağacının yaprak düğümü bir TableScan düğümü ise sorgunun dizin kullanmadığı ve birincil depolamadaki dokümanları taradığı anlamına gelir. Bir dizin kullanılıyorsa yürütme ağacının yaprak düğümünde dizinin dizin kimliği ve dizin alanları gösterilir.
Kullanılan dizinin optimize edilip edilemeyeceğini belirleme
Bir dizin, sorgu motorunun birincil depolamadan getirmesi gereken doküman sayısını azaltabiliyorsa veya alan sıralaması sorgunun sıralama şartını karşılayabiliyorsa sorgu için yararlıdır.
Bir sorgu için dizin kullanılıyorsa ancak sorgu motoru, çok sayıda kayıt döndüren bir tarama düğümü ve ardından az sayıda kayıt döndüren bir filtre düğümü ile tanımlandığı gibi, yine de birçok belgeyi getirip atıyorsa bu, dizin kullanılarak karşılanan sorgu yükleminin seçici olmadığına dair bir işarettir. Daha uygun bir dizin oluşturmak için Dizin oluşturma başlıklı makaleyi inceleyin.
Bir sorgu için çok anahtarlı olmayan bir dizin kullanılıyorsa ancak sorgu motoru, sorgu yürütme ağacındaki bir MajorSort düğümü tarafından tanımlandığı gibi sonuç kümesinin bellek içi yeniden sıralamasını yapmaya devam ediyorsa bu, kullanılan dizinin sorgunun Sıralama koşulunu karşılamak için kullanılamadığının bir işaretidir. Daha uygun bir dizin oluşturmak için sonraki bölüme bakın.
$lookup sorgularını optimize etme
$lookup koleksiyonuna dizinler ekleyerek from sorgularını optimize edebilirsiniz. Bu sayede işlem, koleksiyonun tamamını 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 üzerinde bir dizin oluşturun.
İç içe geçmiş işlem hatlarına sahip $lookup
pipeline seçeneğini $lookup aşamasında $match aşamalarıyla birlikte kullanıyorsanız tam bir koleksiyon taraması yapmamak için yabancı koleksiyonda yer alan alanlarda bir dizin oluşturun:
- Filtre semantiği olan
$matchaşamaları için (örneğin,{$match: {a: true}}), yabancı koleksiyonda yer alan alanlarda (a) bir dizin oluşturun. - Bir alanı sabit bir değerle (örneğin,
{$match: {$expr: {$gt: [a, 10]}}}) veyaletiçinde tanımlanan alanlar ve değişkenler arasında eşitlik karşılaştırmalarıyla (eqveyain) karşılaştıran toplama semantiğine sahip$matchaşamaları için (örneğin,{$match: {$expr: {$eq: [a, "$$a"]}}}), yabancı koleksiyonda yer alan alanlarda bir dizin oluşturun. Çok anahtarlı dizinin planlamada kullanılmayacağını unutmayın.
Dizin Oluşturma
Dizin oluşturmak için dizin yönetimi dokümanlarını inceleyin. Sorgunuzun dizinleri kullanabilmesi için aşağıdaki sırayla alanlar içeren normal (çok anahtarlı olmayan) dizinler oluşturun:
- Eşitlik operatörlerinde kullanılacak tüm alanlar. Sorgular arasında yeniden kullanma olasılığını en üst düzeye çıkarmak için alanları, sorgular arasındaki eşitlik operatörlerinde alanların oluşma sıklığına göre azalan düzende sıralayın.
- Sıralanacak tüm alanlar (aynı sırada).
- Sorgu kısıtlaması seçiciliğinin azalan sırasına göre aralık veya eşitsizlik operatörlerinde kullanılacak alanlar.
- Dizindeki bir sorgunun parçası olarak döndürülecek alanlar: Bu tür alanların dizine eklenmesi, dizinin sorguyu kapsamasına ve birincil depolama alanından doküman getirilmesine gerek kalmamasına olanak tanır.
Dizi alanlarının filtrelenmesini ve sıralanmasını içeren sorgular için çok anahtarlı dizinler oluşturmayı düşünebilirsiniz.
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.