Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk
Öğrenenler, parça anahtarı adaylarını kardinalite, yazma dağılımı ve sorgu hedefleme olmak üzere üç boyuta göre değerlendirecek ve aşırı yüklenen parça karşıtı kalıplardan kaçınacaklardır.
Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk, 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.
Parça Anahtarı Seçimi Neden Kritiktir
Parça anahtarı belirlendikten sonra değiştirilemez ve tüm koleksiyonun parçalamadan çıkarılıp yeniden parçalanması olmadan değiştirilemez — bu pahalı ve kesintiye yol açan bir işlemdir. Yanlış parça anahtarını seçmek sıcak parçalara, kötü sorgu yönlendirmesine ve donanım israfına yol açar. Adayları üç boyuta göre değerlendirmelisiniz: kardinalite, sıklık ve monotonluk.
Kardinalite: Kaç Farklı Değer Var?
Kardinalite, parça anahtarının alabileceği farklı değerlerin sayısıdır. Yüksek kardinalite (ör. userId, email, orderId) iyidir — MongoDB'ye birçok olası öbek sınırı sunar ve dengeleyicinin verileri ayrıntılı biçimde dağıtmasını sağlar. Düşük kardinalite (ör. status: 'active' | 'inactive' veya 50 değer içeren country) bölünemeyen veya taşınamayan dev öbekler oluşturur.
// HIGH cardinality — good shard key
sh.shardCollection('mydb.users', { userId: 1 })
// LOW cardinality — avoid: only 2 chunk boundaries possible
sh.shardCollection('mydb.users', { status: 1 }) // BADSıklık: Değerler Ne Kadar Dengeli Dağıtılmış?
Sıklık, her bir parça anahtarı değerini kaç belgenin paylaştığını ölçer. Yüksek kardinaliteli anahtarlar bile az sayıda değer belgelerin büyük çoğunluğunda görünüyorsa sorun yaratabilir. Örneğin countryCode alanı 200 farklı değer içerebilir, ancak kullanıcıların %90'ı tek bir ülkeden olabilir — bu da bölünemeyen dev bir sıcak öbek oluşturur.
// Estimate frequency distribution before choosing
db.users.aggregate([
{ $group: { _id: '$countryCode', count: { $sum: 1 } } },
{ $sort: { count: -1 } },
{ $limit: 10 }
])
// If top 1 value has 80%+ of docs, this is a bad shard keyMonotonluk: Değerler Her Zaman Artıyor mu?
Monotonluk, parça anahtarı değerlerinin zaman içinde sürekli artıp artmadığını (veya azalıp azalmadığını) ifade eder. createdAt zaman damgaları ve ObjectId (_id) gibi alanlar monotonik olarak artar. Bu sorunludur; çünkü tüm yeni eklemeler tek bir parçadaki aynı 'en yüksek' öbeğe düşer ve veriler geçmişte dengeli dağılmış olsa bile yazma açısından sıcak bir nokta oluşturur.
// Monotonic keys cause write hot spots
// All new orders go to the shard with the latest date range
sh.shardCollection('mydb.orders', { createdAt: 1 }) // BAD for high insert rate
// Fix: use hashed sharding to spread monotonic keys
sh.shardCollection('mydb.orders', { createdAt: 'hashed' })İdeal Parça Anahtarı Özelliklerinin Özeti
İdeal parça anahtarı şu özelliklere sahiptir: Yüksek kardinalite — binlerce veya milyonlarca farklı değer. Düşük sıklık çarpıklığı — hiçbir tek değer baskın değildir. Monotonik olmayan dağılım — değerler her zaman artmaz veya karma parçalaması kullanılır. Sorgu uyumu — hedefli yönlendirme için en sık kullanılan ve gecikmeye duyarlı sorgularınızdaki filtrelerle eşleşir.
Bileşik Parça Anahtarları
Bileşik parça anahtarı, daha iyi dağıtım için iki alanı birleştirir. Örneğin { tenantId: 1, createdAt: 1 }, kiracılar arasında dağıtım yapar (yüksek kardinalite) ve her kiracı içinde aralık sorgularına olanak tanır. İlk alan kaba dağıtımı belirler; ikinci alan ince ayrıntılı bölme sağlar. Bileşik anahtarlar, birden çok alan içeren sorgu koşullarını hedefli sorgular olarak karşılayabilir.
// Compound shard key: tenant + date
sh.shardCollection('mydb.events', { tenantId: 1, createdAt: 1 })
// This query is fully targeted (both shard key fields present)
db.events.find({ tenantId: 't123', createdAt: { $gte: ISODate('2025-01-01') } })Karmalanmış Parça Anahtarları
Karmalanmış parça anahtarı, alan değerini bir öbeğe eşlemeden önce bu değere bir karma işlevi uygular. Bu işlem, ObjectId gibi monotonik anahtarları rastgele dağıtılmış karma değerlerine dönüştürerek yazma sıcak noktalarını ortadan kaldırır. Bunun karşılığında, karma değerleri özgün sırada depolanmadığından alandaki aralık sorguları dağıt-topla sorgularına dönüşür.
// Hashed sharding: uniform write distribution
sh.shardCollection('mydb.events', { _id: 'hashed' })
// Range query on _id is now scatter-gather (con)
// But all inserts are evenly distributed (pro)Coğrafi Dağıtım için Bölge Parçalama
MongoDB, etiketleri (bölgeleri) kullanarak parça anahtarı aralıklarını belirli parçalara atadığınız bölge parçalamaya olanak tanır. Bu, veri yerleşimi gereksinimleri için kullanışlıdır: Avrupalı kullanıcı verileri EU bölgesindeki parçalara, US verileri ise US parçalarına sabitlenebilir. Bölge parçalama, ilk bileşeni bölge ön eki olan bileşik bir parça anahtarı gerektirir.
// Tag shards with zones
sh.addShardTag('shard01', 'EU')
sh.addShardTag('shard02', 'US')
// Assign key ranges to zones
sh.addTagRange('mydb.users',
{ region: 'EU', userId: MinKey },
{ region: 'EU', userId: MaxKey },
'EU'
)Adayları Değerlendirme: Uygulamalı Kontrol Listesi
Parça anahtarı adaylarını değerlendirirken: 1) Bir kardinalite kontrolü çalıştırın — db.col.distinct('field').length sonucu binlerce veya daha fazla olmalıdır. 2) Bir toplama işlemiyle sıklık dağılımını kontrol edin. 3) Alanın monotonik olup olmadığını belirleyin (zaman damgaları, otomatik artan değerler). 4) En sık kullandığınız 5 sorguyu inceleyin — aday alan, bu sorguların filtrelerinde yer alıyor mu?
// Quick cardinality check
db.events.distinct('userId').length // want > 10,000+
// Frequency check — any value > 1% of docs is a risk
const total = db.events.countDocuments()
db.events.aggregate([
{ $group: { _id: '$userId', n: { $sum: 1 } } },
{ $match: { n: { $gt: total * 0.01 } } }
])Karmalanmış Parça Anahtarı Olarak _id Alanı
Birçok iş yükü için yaygın ve güvenli bir varsayılan seçenek { _id: 'hashed' } kullanmaktır. MongoDB ObjectId değerleri monotonik olsa da karmalandıktan sonra dengeli biçimde dağıtılır. Bu, başlangıçtan itibaren tekdüze yazma dağılımı sağlar. Temel sınırlama, _id üzerindeki tüm aralık sorgularının dağıt-topla sorgularına dönüşmesidir — ancak belge düzeyinde arama iş yüklerinin çoğu için bu kabul edilebilirdir.
// Safe default for write-heavy workloads without range queries
sh.shardCollection('mydb.messages', { _id: 'hashed' })
// Single-document lookup by _id is still targeted
// (hash is deterministic: mongos knows which shard)
db.messages.findOne({ _id: ObjectId('...') })Atlas'ta Parça Anahtarı Seçimi
MongoDB Atlas, Performans Danışmanı içinde sorgu düzenlerinizi analiz eden ve gerçek kullanıma göre parça anahtarları öneren bir Parça Anahtarı Danışmanı sunar. Bu araç monotonik anahtarları, sıklık çarpıklığını ve eksik dizinleri tespit edebilir. Parçalamadan önce danışmanı kullanmak, sorgu düzenlerinin zaten belirlenmiş olduğu üretim iş yükleri için özellikle yararlıdır.
Hızlı Kontrol
Bu derste MongoDB ve NoSQL Veritabanları kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: iyi bir parça anahtarı yüksek kardinaliteye, düşük sıklık çarpıklığına sahiptir ve monotonik değerlerden kaçınır, bileşik parça anahtarları dağıtım ve sorgu hedefleme için kapsamı birleştirir ve karmalanmış parçalama, aralık sorgusu verimliliği pahasına monotonik anahtarların sıcak noktalarını etkisizleştirir. Sırada aralıklı ve karmalanmış parçalama stratejilerini ayrıntılı olarak karşılaştıracağız.
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
“Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk” dersi ücretsiz mi?
Evet — “Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk” 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.
“Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk” dersinde ne öğreneceğim?
Öğrenenler, parça anahtarı adaylarını kardinalite, yazma dağılımı ve sorgu hedefleme olmak üzere üç boyuta göre değerlendirecek ve aşırı yüklenen parça karşıtı kalıplardan kaçınacaklardı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.
“Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk” 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
- Parçalama Kavramları: Öbekler, Dengeleyici ve Parça Anahtarları
- Parça Anahtarı Seçme: Kardinalite, Sıklık, Monotonluk
- Aralıklı ve Özetlenmiş Parçalama Stratejileri
- Bölge Parçalama: Verileri Bölgelere Sabitleme