Bilgi Bankası
MongoDBPerformans ve kapasite 14 dk 14.06.2026

MongoDB indeks yaşam döngüsü: her yavaş sorguya indeks eklemeyin

MongoDB’de indeks eklemek kolaydır; bu yüzden fazla indeks biriktirmek de kolaydır. Her indeks okumayı hızlandırabilir ama yazmayı, belleği ve disk kullanımını ağırlaştırır. Bu yazı “hangi indeks gerçekten işe yarıyor?” sorusunu sorar.

Bu yazı sana şu durumda yardımcı olur
  • koleksiyonda çok sayıda indeks var ama sorgular hâlâ yavaş
  • write gecikme indeks eklendikçe artıyor
  • düşük seçicilikte alanlar indekslenmiş
  • compound index sırası sorguya uymuyor
  • hangi indeksin kullanıldığı bilinmiyor
Yazıyı bitirince

Kardinalite ve sorgu desenine göre indeks seçebilecek, explain çıktısıyla işe yarayıp yaramadığını görebilecek ve gereksiz indeks temizliğini daha güvenli planlayabileceksiniz.

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 operasyonunu yönetilebilir hale getirir; ama indeks yaşam döngüsü uygulamanızın sorgu alışkanlığına bağlıdır. Platform size güvenli zemin verir, iyi indeks kararını ise ölçümle siz verirsiniz.

İndeks bir hızlandırıcıdır, ücretsiz değildir

MongoDB’de indeks eklemek ilk bakışta zararsız görünür. Oysa her indeks yazma sırasında güncellenir, disk kaplar ve bellekte yer ister. Okumayı hızlandırırken yazmayı yavaşlatabilir.

Bu yüzden indeks kararını “bu sorgu yavaş” diye değil, “bu sorgu sık, kritik ve seçici mi?” diye vermek daha sağlıklıdır.

  • Sık çalışmayan sorgular için indeks eklemek gereksiz olabilir.
  • Düşük kardinaliteli alanlar tek başına zayıf indeks adaylarıdır.
  • Compound index sırası sorgunun equality, sort ve range düzenine göre seçilmelidir.
  • Kullanılmayan indeksler yazma maliyeti üretmeye devam eder.

Kardinaliteyi basitçe düşünün

Kardinalite, bir alanın kaç farklı değer aldığıyla ilgilidir. status gibi birkaç değer alan bir alan tek başına çok seçici değildir. tenant_id, user_id veya created_at gibi alanlarla birlikte anlam kazanabilir.

Basit dağılım kontrolü

mongodb-cardinality.js
db.orders.aggregate([
  { $group: { _id: "$status", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
])

db.orders.distinct("tenant_id").length

İndeks kullanılıyor mu, gerçekten bakın

İndeks oluşturuldu diye sorgu onu kullanmak zorunda değildir. explain executionStats çıktısı, taranan doküman sayısı ile dönen sonuç sayısı arasındaki farkı gösterir. Bu fark hâlâ büyükse indeks ya yanlış sıradadır ya da sorgu yeterince seçici değildir.

Compound index ve doğrulama

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

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

Temizlik yapmadan önce kullanım kanıtı toplayın

Gereksiz indeksleri silmek iyi bir bakım işidir; ama körlemesine yapılmamalıdır. Önce hangi indekslerin kullanıldığını, hangi sorguların kritik olduğunu ve silme sonrası geri dönüş planını belirleyin.

TürkDB tarafında yedekleme/geri yükleme ve cluster görünürlüğü bu tür bakımlarda güven verir. Ama indeks silme kararının asıl dayanağı uygulama sorgu trafiğinizdir.

İndeks listesini çıkarma

mongodb-index-inventory.js
db.orders.getIndexes()

// Kullanılmayan indeks temizliği planlı yapılmalıdır
// db.orders.dropIndex("idx_old_unused_index")
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