Bilgi Bankası
MongoDBPerformans ve kapasite 13 dk 14.06.2026

MongoDB yavaş sorgu ve indeks büyümesi: explain, compound index ve replica set sağlığı

MongoDB ilk günlerde çok rahat hissettirir: şema esnektir, veri hızlı akar. Ama veri büyüdüğünde kötü indeks ya da belirsiz sorgu deseni, kullanıcıya yavaş listeleme olarak döner. Bu yazı, “COLLSCAN gördüm, şimdi ne yapacağım?” sorusuna odaklanır.

Bu yazı sana şu durumda yardımcı olur
  • COLLSCAN görünen explain çıktısı
  • nReturned düşükken totalDocsExamined çok yüksek
  • ikincil replika gecikmesi
  • büyüyen index boyutu ve disk baskısı
  • sık değişen doküman şeması nedeniyle sorgu davranışının bozulması
Yazıyı bitirince

executionStats çıktısında nReturned, totalDocsExamined ve executionTimeMillis değerlerini okuyup indeksin gerçekten işe yarayıp yaramadığını anlayacaksınız. Ayrıca replica set sağlığını performans yorumundan ayırabileceksiniz.

TürkDB açısından ürünleşme notu

Bu bölüm, TürkDB’nin ilgili problemi hangi ürün ilkeleri ve kontrol noktalarıyla ele alacağını anlatır. Kapsam, gerçek iş yükü ve ihtiyaçla birlikte netleşir.

TürkDB MongoDB tarafında replica set, TLS, bağlantı bilgisi ve yedekleme/geri yükleme işlerini düzenli bir zemine taşımayı hedefler. Bu, indeks ve veri modeli kararlarını hafife aldırmamalı; tam tersine ekibin asıl çözmesi gereken yere odaklanmasına yardım etmelidir.

COLLSCAN neden bir uyarı işaretidir?

Koleksiyon küçükken COLLSCAN can yakmaz; hatta ekip “çalışıyor işte” diye düşünür. Veri büyüdüğünde aynı sorgu CPU, disk ve bellek baskısı üretir. Özellikle tenant_id, status, created_at gibi alanlarla filtrelenen çok kiracılı uygulamalarda compound index erken tasarlanmalıdır.

Explain çıktısında totalDocsExamined değeri nReturned değerinden çok büyükse, sorgu gereğinden fazla doküman geziyor demektir.

executionStats ile plan okuma

mongodb-explain.js
db.orders.find(
  { tenant_id: "acme", status: "paid" },
  { _id: 1, status: 1, created_at: 1 }
).sort({ created_at: -1 }).limit(50).explain("executionStats")

Compound index sırasını doğru seçin

MongoDB compound index tasarımında önce eşitlik filtreleri, sonra sıralama ve range alanları düşünülür. Sorgu tenant_id ve status ile filtreleyip created_at ile sıralıyorsa index sırası bu erişim biçimini yansıtmalıdır.

Çok kiracılı sorgu için indeks

mongodb-index.js
db.orders.createIndex(
  { tenant_id: 1, status: 1, created_at: -1 },
  { name: "idx_orders_tenant_status_created" }
)

db.orders.getIndexes()

İndeks eklemeden önce sorgu desenini sabitleyin

MongoDB’de her yavaş sorguya indeks eklemek kısa vadede rahatlatır ama yazma maliyetini ve disk kullanımını artırır. Önce hangi sorgunun ürün açısından kritik olduğunu, hangi alanlarla filtrelediğini ve hangi sıralamayı istediğini netleştirmek gerekir.

Aynı koleksiyonda hem katalog listeleme hem admin araması hem raporlama yapılıyorsa tek indeks seti hepsini çözmez. Kritik kullanıcı akışları için indeks, raporlama için ayrı okuma modeli veya aggregation çıktısı gerekebilir.

  • Equality alanlarını compound index başına koyun.
  • Sort alanını sorgunun kullandığı yönde ekleyin.
  • Düşük seçiciliğe sahip boolean alanları tek başına indekslemeyin.
  • Projection kullanarak büyük dokümanların gereksiz alanlarını taşımayın.

Replica set ve yönetilen operasyon

Yavaş sorgu bazen yalnızca sorgudan değil, replica lag veya disk baskısından da kaynaklanır. Uygulama secondary okumaya yönleniyorsa gecikme kullanıcıya eski veri veya dengesiz gecikme olarak dönebilir.

TürkDB’de MongoDB cluster oluşturma, bağlantı bilgisini alma ve yedek akışları tek arayüzdedir. Özellikle içerik ve katalog sistemlerinde geri yükleme edilebilirlik indeks değişiklikleri kadar önemlidir.

TürkDB MongoDB kullanım akışı

turkdb-mongodb.sh
turkdb cluster create --name catalog-mongo \
  --type mongodb \
  --version 7.0 \
  --plan standard \
  --replicas 3 \
  --wait

turkdb connect catalog-mongo --no-tunnel
turkdb backup create catalog-mongo
turkdb backup list catalog-mongo
Bu TürkDB bloğu kavramsal ürün akışını anlatır; mevcut çalışan komut, garanti edilen özellik veya teslim tarihi vaadi olarak okunmamalıdır.

Düzeltmenin işe yaradığını nasıl anlarsınız?

İndeks ekledikten sonra explain çıktısında winningPlan tarafında IXSCAN görmeyi, totalDocsExamined değerinin nReturned değerine yaklaşmasını ve executionTimeMillis değerinin düşmesini beklersiniz.

Eğer IXSCAN var ama hâlâ çok doküman inceleniyorsa indeks sırası yanlış olabilir veya filtre alanları yeterince seçici değildir. Bu durumda sorgu tasarımı ve veri modeli tekrar ele alınmalıdır.

İndeks sonrası doğrulama

mongodb-verify.js
const plan = db.orders.find(
  { tenant_id: "acme", status: "paid" },
  { _id: 1, status: 1, created_at: 1 }
).sort({ created_at: -1 }).limit(50).explain("executionStats")

printjson({
  nReturned: plan.executionStats.nReturned,
  totalDocsExamined: plan.executionStats.totalDocsExamined,
  executionTimeMillis: plan.executionStats.executionTimeMillis
})
Devam etmek istersen

Sorunu motor bazında derinleştirin

Benzer belirtiler farklı motorlarda farklı nedenlere dayanır; yayınlanan tüm rehberleri ana sayfadan takip edebilirsiniz.

Tüm makaleler