MongoDB Academy · Ders

Bileşik Dizin Öneki Kuralı ve ESR İlkesi

Öğrenenler, sorgu kapsamını en üst düzeye çıkarmak için Eşitlik-Sıralama-Aralık dizin tasarım ilkesini bileşik dizinlere uygulayacaklardır.

2. ders / 413 adım

Bileşik Dizin Öneki Kuralı ve ESR İlkesi, CoddyKit'te ücretsiz bir MongoDB Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, MongoDB Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. MongoDB Academy kursu toplamda 4 dersten oluşur.

Bileşik Dizin Alan Sırasının Önemi

Birden fazla alana sahip bileşik dizin, çok çeşitli sorgulara hizmet edebilir; ancak alanlar yalnızca doğru sırada yer alıyorsa. MongoDB, bir sorgunun filtresi dizinin önek kısmıyla eşleşiyorsa bileşik dizini bu sorguyu karşılamak için kullanabilir. Dizin tanımındaki alanların sırası, hangi sorguların bundan yararlanacağını doğrudan belirler.

Önek Kuralı Açıklaması

{ a: 1, b: 1, c: 1 } bileşik dizini, şu alanlarda filtreleme yapan sorgular tarafından kullanılabilir: { a }, { a, b } veya { a, b, c }. Bunlar öneklerdir. Yalnızca { b } ya da { b, c } üzerinde filtreleme yapan bir sorgu bu dizini kullanamaz; bunun yerine koleksiyon taraması yapar. Dizin, önce soyadına, ardından ada göre sıralanmış bir telefon rehberi gibidir: yalnızca soyada veya soyadına ve ada göre arama yapabilirsiniz, ancak yalnızca ada göre arama yapamazsınız.

// Index: { status: 1, customerId: 1, createdAt: 1 }
db.orders.createIndex({ status: 1, customerId: 1, createdAt: 1 })

// Uses index (prefix: status)
db.orders.find({ status: 'pending' })

// Uses index (prefix: status + customerId)
db.orders.find({ status: 'pending', customerId: 'c001' })

// Does NOT use index (no leading prefix)
db.orders.find({ customerId: 'c001' })

ESR İlkesi: Eşitlik, Sıralama, Aralık

ESR ilkesi, bileşik dizinlerde alan sırasını belirleyen bir kuraldır: Eşitlik alanlarını önce, Sıralama alanlarını ikinci, Aralık alanlarını son sıraya koyun. Bu sıra, dizinin karşılayabileceği sorgu bölümünü en üst düzeye çıkarır ve incelenmesi gereken dizin girdilerinin sayısını en aza indirir. ESR, MongoDB'de bileşik dizin tasarımının en önemli kuralıdır.

// Query: find pending orders for customer c001, sorted by date,
// for dates after Jan 2025
// E: status = 'pending' (equality)
// S: createdAt (sort)
// R: customerId in ['c001','c002'] (range / $in)

// ESR-ordered index
db.orders.createIndex({ status: 1, createdAt: 1, customerId: 1 })

Eşitlik Alanları Neden Önce Gelir

Eşitlik koşulları (field: value veya $eq), dizin taramasını tek ve sabit bir değerle sınırlar. Bunları ilk sıraya koymak, sorgu planlayıcısının değerlendirmesi gereken dizin girdilerinin sayısını büyük ölçüde azaltır. Eşitlik, eşleşen anahtarların tam aralığını belirledikten sonra sıralama ve aralık işlemleri çok daha küçük bir veri kümesi üzerinde çalışır.

// E first: status equality narrows to ~5% of index
// Then sort on createdAt within that slice
// Then range on amount within that sorted slice
db.orders.createIndex({ status: 1, createdAt: 1, amount: 1 })

db.orders.find({ status: 'shipped' })
  .sort({ createdAt: -1 })
  .hint({ status: 1, createdAt: 1, amount: 1 })

Sıralama Alanları Neden Aralık Alanlarından Önce Gelir

Sıralama alanlarını aralık alanlarından önce yerleştirmek, MongoDB'nin engelleyici bir bellek içi sıralama yapmadan sıralamayı karşılamak için dizini kullanmasını sağlar. Aralık alanları sıralama alanlarından önce gelirse MongoDB, eşleşen tüm aralık belgelerini taramalı, bunları bellekte sıralamalı ve ardından sonuçları döndürmelidir; bu da CPU ve bellek ek yükü oluşturur. Sıralama alanları ikinci sırada olduğunda sonuçlar dizinden zaten doğru sırada gelir.

// Without ESR: range before sort forces in-memory sort
db.orders.createIndex({ status: 1, amount: 1, createdAt: 1 })

db.orders.find({ status: 'pending', amount: { $gt: 50 } })
  .sort({ createdAt: 1 })
// explain() shows: SORT stage (in-memory sort needed)

// With ESR: sort before range avoids in-memory sort
db.orders.createIndex({ status: 1, createdAt: 1, amount: 1 })
// explain() shows: no SORT stage

Aralık Alanlarını Sona Koymak: Neden İşe Yarar

$gt, $lt, $gte, $lte, $in ve düzenli ifadeler gibi aralık koşulları, dizinin bitişik bir bölümünü kapsar. Bunları sona koyduğunuzda MongoDB önce sonuçları eşitlikle daraltır ve sıralama düzeninde sunar, ardından aralık denetimini son filtre olarak uygular. Aralık koşulu, sıralama alanlarının belirlediği sıralı dolaşma düzenini bozmadığı için dizin taraması verimli kalır.

// ESR applied correctly
// E: userId (equality)
// S: timestamp (sort)
// R: score (range)
db.events.createIndex({ userId: 1, timestamp: 1, score: 1 })

db.events.find({
  userId: 'u123',
  score: { $gte: 80 }
}).sort({ timestamp: -1 })

$in: Aralık mı, Eşitlik mi?

Az sayıda değer içeren $in, eşitliğe daha çok benzer ve ilk sıraya yerleştirilebilir. Liste büyük olduğunda aralık gibi davranır ve dizinde daha sonraki bir konuma yerleştirilmelidir. Kullanışlı bir kural şudur: $in listesinde 10–20'den az değer varsa ve bu listeyi sık sık sorguluyorsanız, onu eşitlik olarak değerlendirin (ilk sıraya koyun). Büyük ve dinamik listeleri ise aralık olarak değerlendirin (son sıraya koyun).

// Small $in (2 values) — treat as equality, put first
db.orders.createIndex({ status: 1, createdAt: 1 })
db.orders.find({ status: { $in: ['pending', 'processing'] } })
  .sort({ createdAt: -1 })

// Large $in — treat as range, put last
db.orders.createIndex({ region: 1, createdAt: 1, userId: 1 })
db.orders.find({
  region: 'EU',
  userId: { $in: hundredsOfUserIds }
}).sort({ createdAt: -1 })

ESR'yi explain() ile Doğrulama

Dizin tasarımınızı her zaman explain('executionStats') ile doğrulayın. Şunları arayın: IXSCAN (dizin taraması) — iyi. COLLSCAN (koleksiyon taraması) — eksik dizin var. SORT aşamasının bulunması — bellek içi sıralama yapılıyor, dizin alanlarının sırası yanlış olabilir. En iyi bileşik dizin için keysExamined / nReturned değerleri 1'e yakın olmalıdır.

db.orders.find({ status: 'pending', amount: { $gt: 50 } })
  .sort({ createdAt: 1 })
  .explain('executionStats')

// Good: { stage: 'IXSCAN', nReturned: 42, keysExamined: 44 }
// Bad:  { stage: 'COLLSCAN', nReturned: 42, docsExamined: 500000 }

Önek Kuralı ve Kısmi Dizin Yeniden Kullanımı

Önek kuralı sayesinde, iyi tasarlanmış tek bir bileşik dizin birkaç tek alanlı dizinin yerini alabilir. { a: 1, b: 1, c: 1 } dizini, { a: 1 } ve { a: 1, b: 1 } üzerindeki ayrı dizinleri gereksiz kılar. Daha az dizin, yazma işlemlerinde daha az ek yük ve bellek üzerinde daha az baskı anlamına gelir; bu, dizin bakımının her ekleme, güncelleme ve silme işlemine gecikme eklediği, yazma ağırlıklı iş yükleri için önemlidir.

// One compound index replaces three single-field indexes
db.users.createIndex({ country: 1, city: 1, age: 1 })

// Redundant (covered by compound prefix rule):
// db.users.createIndex({ country: 1 })          -- REDUNDANT
// db.users.createIndex({ country: 1, city: 1 }) -- REDUNDANT

Dizin Seçiciliği ve Alan Sırası

ESR'nin yanı sıra seçiciliği de göz önünde bulundurun; yani aynı değeri kaç belgenin paylaştığını. En seçici eşitlik alanını ilk sıraya koyun (en az yinelenen alanı). Örneğin userId, status'tan daha seçicidir. Daha seçici alanı ilk sıraya koymak taramayı daha hızlı daraltır. Birden fazla eşitlik alanı olduğunda, en yüksek performans için bunları en seçiciden en az seçiciye doğru sıralayın.

// userId is highly selective (millions of users)
// status is low-selectivity (only 5 values)

// More efficient: selective equality field first
db.orders.createIndex({ userId: 1, status: 1, createdAt: 1 })

// Less efficient: low-selectivity field first
db.orders.createIndex({ status: 1, userId: 1, createdAt: 1 })

ESR'yi Uygulamaya Geçirme

Bir bileşik dizin tasarlarken, en önemli sorgunuzun filtre koşullarını ve sıralamasını listeleyerek başlayın; ardından her alanı E (eşitlik), S (sıralama) veya R (aralık) olarak sınıflandırın. Dizini bu sırayla oluşturun. IXSCAN gördüğünüzü, SORT aşaması olmadığını ve keysExamined/nReturned oranının 1'e yakın olduğunu doğrulamak için explain('executionStats') çalıştırın. Sorgu kalıpları değiştiğinde dizini yeniden değerlendirin.

// Practical checklist:
// Query: find users in 'NY' (E), sorted by signup (S), age > 18 (R)
// E: state = 'NY'
// S: signupDate
// R: age > 18
db.users.createIndex({ state: 1, signupDate: 1, age: 1 })

// Verify no in-memory sort and good key ratio:
db.users.find({ state: 'NY', age: { $gt: 18 } })
  .sort({ signupDate: -1 })
  .explain('executionStats')

Hızlı Kontrol

Bu derste ele alınan MongoDB ve NoSQL veritabanları kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: bir bileşik dizin yalnızca sorgu, dizin alanlarının bir önekiyle eşleştiğinde kullanılabilir, ESR ilkesi, en geniş sorgu kapsamı için alanların Eşitlik, Sıralama ve Aralık şeklinde sıralanmasını belirler ve sıralama alanlarını aralık alanlarından önce yerleştirmek, maliyetli bellek içi sıralama aşamalarını ortadan kaldırır. Sırada, dizin kesişimini bileşik dizinlerle karşılaştıracağız.

Başlamak ücretsiz

Yapay zeka eğitmeniyle JavaScript öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“Bileşik Dizin Öneki Kuralı ve ESR İlkesi” dersi ücretsiz mi?

Evet — “Bileşik Dizin Öneki Kuralı ve ESR İlkesi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve MongoDB Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. MongoDB Academy kursu toplamda 4 dersten oluşur.

“Bileşik Dizin Öneki Kuralı ve ESR İlkesi” dersinde ne öğreneceğim?

Öğrenenler, sorgu kapsamını en üst düzeye çıkarmak için Eşitlik-Sıralama-Aralık dizin tasarım ilkesini bileşik dizinlere uygulayacaklardır. MongoDB Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

MongoDB Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te MongoDB Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Bileşik Dizin Öneki Kuralı ve ESR İlkesi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu MongoDB Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her MongoDB Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Veritabanı Profilleyicisi ve Yavaş Sorgu Günlüğü
  2. Bileşik Dizin Öneki Kuralı ve ESR İlkesi
  3. Dizin Kesişimi ve Bileşik Dizinler
  4. Toplulaştırma İşlem Hattını İyileştirme İpuçları
← MongoDB Academy Sayfasına Dön