MongoDB’de Bileşik İndexlerin Ustalaşması
Bu kılavuz, veritabanı performansını optimize etmek için çok önemli bir teknik olan MongoDB’deki bileşik indekslerin inceliklerine dalmaktadır. Temel çalışma biçimlerini anlamaktan etkinliklerini analiz etmeye ve yaygın sorunları gidermeye kadar her şeyi ele alacağız.
- Bileşik İndexleri Anlamak
- Bileşik İndexler Oluşturmak
- Bileşik İndexlerle Sorgulama
- İndex Kullanımını Analiz Etmek
- En İyi Uygulamalar ve Optimizasyon
- Sıkça Sorulan Sorular
1. Bileşik İndexleri Anlamak
MongoDB’de bileşik indeks, tek bir belge içinde birden fazla alanı kapsayan bir indekstir. Sadece tek bir alan üzerindeki sorguları hızlandıran tek alanlı indekslerin aksine, bileşik indeksler, birden fazla alanı içeren sorguların hızını önemli ölçüde artırarak uygulama performansını önemli ölçüde etkiler. İndeks içindeki alanların sırası kritiktir; MongoDB, belgeleri verimli bir şekilde bulmak için bu sırayı kullanır.
İndeksin başındaki alanlarla eşleşen sorgular en fazla faydayı sağlar. Bir sorgu yalnızca baştaki alanları kullanıyorsa, indeks hem filtreleme hem de sıralama için tamamen kullanılır. Ancak, bir sorgu indeks dışındaki alanları kullanıyorsa, MongoDB indeksi kısmen kullanabilir ve kalan kriterler için koleksiyon taramasına geri dönebilir, böylece performans artışlarını ortadan kaldırabilir.
Örneğin, category
, price
ve name
alanlarına sahip bir products
koleksiyonu düşünelim. { "category": 1, "price": -1 }
üzerindeki bileşik indeks, category
ile filtreleme ve ardından fiyatı azalan sırada sıralama yaparak sorguları optimize eder.
2. Bileşik İndexler Oluşturmak
db.collection.createIndex()
yöntemini kullanarak bileşik indeksler oluşturmak basittir. Argüman, anahtarlar alan adlarını ve değerler sıralama sırasını (1 artan, -1 azalan) temsil eden bir belgedir.
// Kategori (artan) ve fiyat (azalan) üzerinde bileşik indeks oluşturun
db.products.createIndex( { category: 1, price: -1 } );
// Farklı sıralama sıralarına sahip birden fazla alan üzerinde bileşik indeks oluşturun
db.users.createIndex( { firstName: 1, lastName: -1, age: 1 } );
// Benzersiz ve seyrek seçenekler ekleyin
db.products.createIndex( { category: 1, price: -1 }, { unique: true, sparse: true } );
unique: true
, indeksli alanlar arasında benzersizliği zorunlu kılar; sparse: true
ise yalnızca indeksli alanlar null olmayan belgeleri indeksler.
3. Bileşik İndexlerle Sorgulama
MongoDB’nin sorgu optimizasyoncusu, sorgu baştaki alanlarla eşleşiyorsa ve sıralama sırası uyuyorsa otomatik olarak bileşik bir indeksi kullanır. Örneğin, aşağıdaki sorgu { "category": 1, "price": -1 }
indeksinden yararlanır:
db.products.find( { category: "Electronics" } ).sort( { price: -1 } );
Bu sorgu, category
(baştaki indeks alanı) ile filtreler ve price
(indeksin sıralama sırasıyla eşleşir) ile sıralar. Ancak, bu sorgu bu kadar faydalı olmaz:
db.products.find( { price: { $lt: 100 } } ).sort( { category: 1 } );
price
baştaki alan değildir ve sıralama sırası indeksle uyumlu değildir.
4. İndex Kullanımını Analiz Etmek
İndeks kullanımını analiz etmek için db.collection.find().explain()
kullanın. Bu, hangi indekslerin kullanıldığı (veya kullanılmadığı) ve yürütme süreleri dahil olmak üzere sorgu yürütme planı hakkında ayrıntılı bilgiler sağlar.
db.products.find( { category: "Electronics" } ).sort( { price: -1 } ).explain();
“executionStats” bölümünü inceleyin. İndeks kullanılıyorsa, indeks anahtar kullanımı ve incelenen belge sayısını görürsünüz. “COLLSCAN”, indeks kullanımından daha az verimli olan tam bir koleksiyon taramasını gösterir.
5. En İyi Uygulamalar ve Optimizasyon
Dikkatli indeks seçimi çok önemlidir. Aşırı indeksleme yazma işlemlerini yavaşlatırken, yetersiz indeksleme verimsiz sorgulara yol açar. Sık kullanılan sorgu kalıplarını önceliklendirin ve gerektiğinde artımlı olarak indeksler ekleyin. İndeks kullanımını düzenli olarak izleyin ve uygulama ihtiyaçlarına göre ayarlayın. Daha basit indeks yönetimi için MongoDB Compass GUI’sini kullanmayı düşünün.
6. Sıkça Sorulan Sorular
- Kaç tane bileşik indeks oluşturmalıyım? Optimal sayı, uygulamanızın sorgu kalıplarına bağlıdır. Aşırı indekslemeyi önlemek için bir denge gereklidir.
- Sorgum indeksle mükemmel bir şekilde eşleşmezse ne olur? MongoDB indeks parçalarını kullanabilir ancak eşleşmeyen parçalar için yine de bir koleksiyon taramasına başvurabilir.
- Karışık artan/azalan alanlara sahip bileşik indeksler oluşturabilir miyim? Evet, sıra optimal performans için çok önemlidir.
- Bir bileşik indeksi nasıl silerim? İndeks adını veya spesifikasyonunu belirterek
db.collection.dropIndex()
kullanın:
// Ada göre silme
db.products.dropIndex("category_1_price_-1");
// Spesifikasyona göre silme
db.products.dropIndex( { category: 1, price: -1 } );