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