MongoDB'de Indexing ve Dahası
Tags: mongodb, nosql, database
Published: 2022-10-08 00:21:25

Herkese merhaba. Çook uzun süredir (neredeyse 8 ay) yazı yazmıyordum. En büyük nedeni üşengeçlik tabi. 

---

## MongoDB Nedir?

MongoDB, yüksek hacimli veri depolama için kullanılan belge odaklı bir NoSQL veritabanıdır. MongoDB relational veritabanları gibi "table" ve "rows"
kullanmamaktadır. Bunun yerine "collections" ve "documents" kullanmaktadır. "Documents" dediğimiz şeyler key-value yapısı kullanır. Programlamada
sıkça kullandığımız dictionary veya json yapılarına benzetilebilir.

---

## Index Nedir?


Index veritabanına attığımız sorguların daha hızlı sonuç vermesi için oluşturulan yapılardır. Indexleme yaptıktan sonra veritabanında
bir kayıt aradığınızda tüm kayıtları tek tek incelemeye gerek duymadan daha hızlı sonuç döner.

---

## Index Oluşturma

MongoDB sadece "_id" özelinde atılan sorgular için id bilgisini kendisi indexliyor. Biz ise şimdi örnek bir senaryo canlandıracağız.

İlk olarak user collectionının mevcut indexlerine bakalım. Ben veritabanı uygulaması olarak [NoSQLBooster](https://nosqlbooster.com/)
kullanıyorum. Orada örnek vereceğim. Collection üstüne sağ tılayıp Indexes -> View Indexes yolunu takip ediyorum. Beni şöyle bir ekran karşılıyor.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2tr6uy06edahw8i3vuux.png)

Yani görüyoruz ki MongoDB bizim için indexlemiş id keyini. Şimdi senaryomuza geçelim.


Veritabanında "user" adında bir collectionınız olduğunu düşünün. Bu collectiona sadece "_id" ile değil aynı zamanda sık sık "email" sorgusu da
attığınızı düşünün. O zaman email ile atılan sorguları daha verimli hale getirmek için email keyini indexleyebiliriz. Gelin bir index oluşturalım.

```
db.user.createIndex({ name: 1 })

```

**Not:** Veritabanında oluşturduğunuz indexler diskte yer kaplamaktadır. 

**"Gereksiz indexleme, indexleme değildir."**
                          
- Bir yazılımcı (ben)
  
---

Güzell veritabanındaki ilk indeximizi oluşturduk. Peki şimdi indexlerimize bakmaya ne dersiniz? Gelin bakalım.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dovttu72e5tngraiicn2.png)

Evet işte artık email keyimiz de index listesinde görünüyor.

---

## Index Tipleri

MongoDB'de birden fazla index tipi vardır. Bu index tiplerini işinize olan uygunluğuna göre seçip kullanabilirsiniz. Bazı index
tiplerini inceleyelim.

### Single Field Indexler

Yukarıda oluşturduğumuz ilk indexi buna örnek gösterebiliriz. Kısaca tek bir field için oluşturulan indexlerdir.

![mongodb](https://www.mongodb.com/docs/manual/images/index-ascending.bakedsvg.svg)


### Compound Indexler

Eğer veritabanına birden fazla key ile sorgu atıyorsanız **Compound Index** kullanabilirsiniz. Bu index tipinde dikkat edilmesi gereken
şey ise indexi oluştururken fieldları nasıl sıraladığımız. Yukarıda dikkat etmemiştik buna ama artık bizim için önemli oluyor. 
Örneğin, bir **Compound Index** ```{ name: 1, no: -1 }``` den oluşuyorsa, index önce kullanıcı ismine göre sıralanır ve ardından 
her kullanıcı ismi puana göre sıralanır.

![mongodb](https://www.mongodb.com/docs/manual/images/index-compound-key.bakedsvg.svg)

Kullanımı **Single Field Index** kullanımı ile aynı. Aşağıda ufak bir örnek yapalım.

```
db.collection.createIndex({ name: 1, no: -1 })
```


### Multikey Indexler

MongoDB, arraylerde depolanan içeriği indexlemek için **Multikey Indexler** kullanır. Array değeri içeren bir alanı indekslerseniz, MongoDB 
dizinin her elemanı için ayrı index girdileri oluşturur. Sorguların arraylerin öğelerini eşleştirerek dizileri içeren belgeleri seçmesine 
olanak tanır.

![mongodb](https://www.mongodb.com/docs/manual/images/index-multikey.bakedsvg.svg)

---

## Kapanış

Index tiplerine de göz attıktan sonra kendi veritabanımdaki son durumu göstereyim.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/evc3rapvd87avw1o6b9j.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vufqvm9dknxyk3noe4ce.png)

Unutmayın gereksiz indexlemeler sizin için dezavantajlı bir durumdur. Bu yüzden indexlemelerinizi planlı yapın.

---

Umarım yazı işinize yaramıştır. Anlamadığınız yerleri, isteklerinizi veya önerilerinizi bana iletbilirsiniz. Keyifli haftalar dilerim :)

Yazılarımı kendi [blogumda](https://ilteriskeskin.github.io/) da paylaşıyorum :D