# MySQL'de Kral Katili: N+1 Sorgu Problemini Çözmek

> Buz ve Ateşin Şarkısı evreninden bir ders alalım: "Chaos is a ladder…" yani "Kaos bir merdivendir." Ancak bu kural MySQL sorgularına kesinlikle uymaz! Aksine, sorgularınızda kaosa yer verirseniz, performansınız bir uçurumdan aşağı yuvarlanabilir. İşte karşınızda, veri tabanı performansını sinsice öldüren N+1 Sorgu Problemi ve onun hikayesi!

- Yazar: [Halit Yeşil](https://halityesil.com/)
- Yayın tarihi: 2024-12-11
- Dil: Türkçe
- Kaynak adres: https://halityesil.com/mysqlde-kral-katili-n1-sorgu-problemini-cozmek/
- İngilizce sürümü: https://halityesil.com/en/the-king-slayer-of-mysql-solving-the-n1-query-problem.md
- Kategori: MySQL
- Etiketler: Eager Loading, EXPLAIN komutu, Join sorguları, Laravel, MySQL performansı, N+1 sorgu problemi, ORM kullanımı, performans sorunları, Query Profiling, SQL sorgu analizi, veri tabanı optimizasyonu, veritabanı performansı
- Lisans: https://creativecommons.org/licenses/by-nc/4.0/
- Atıf: Halit Yeşil. “MySQL'de Kral Katili: N+1 Sorgu Problemini Çözmek”. halityesil.com, 2024-12-11. https://halityesil.com/mysqlde-kral-katili-n1-sorgu-problemini-cozmek/

---

## **N+1 Sorgu Problemi Nedir?**

Hikayemiz genellikle ORM (Object-Relational Mapping) kullanımı sırasında başlar. ORM'ler, geliştiricinin hayatını kolaylaştıran güçlü araçlardır, ancak dikkatsiz kullanıldığında veri tabanı performansına ciddi zarar verebilirler.

Şöyle düşünün: Bir kullanıcı listesi çekiyorsunuz ve her kullanıcıya ait 100 farklı veri daha almanız gerekiyor. ORM bunu farkında olmadan şu şekilde yapabilir:

1. İlk sorgu: "Bana tüm kullanıcıları getir."
2. Daha sonra her kullanıcı için ayrı ayrı: "Bu kullanıcının detaylarını getir."

Sonuç? **1 (ana sorgu) + N (alt sorgular)**, yani *N+1 Sorgu Problemi.*

Küçük bir veri kümesinde fark edilmez, ama kullanıcı sayısı 100’ü geçtiğinde sorgularınız CPU’nuzu adeta bağırta bağırta çalıştırır:

<figure class="wp-block-pullquote">> "Yapma bunu kardeşim, bu iş böyle olmaz!"
> 
> <cite>CPU</cite>

</figure>## **N+1 Sorgu Problemini Nasıl Fark Edersiniz?**

**Belirtiler:**

- Sayfa yüklenmesi yavaşlıyor.
- Veri tabanı sorgularında ciddi artış gözleniyor.
- Sunucunuz beklenmedik bir şekilde fazla kaynak tüketiyor.

**Teşhis:**
Bu aşamada **Query Profiling** kullanabilirsiniz. Örneğin, Laravel gibi bir ORM kullanıyorsanız `->toSql()` veya benzeri araçlarla hangi sorguların çalıştığını görebilirsiniz. SQL sorgularınızı inceleyin ve benzer alt sorguların sayısının gereksiz yere arttığını fark edin.

## Çözüm: Chaos’a Son, Veriye Huzur Getirin

### 1. **Join Kullanımı**

İlk olarak, N+1 problemini çözmenin en temel yöntemi, sorgularınızı birleştirmek. Örneğin:

**Problemli Kod:**

```sql
SELECT * FROM users;
-- Daha sonra her kullanıcı için:
SELECT * FROM posts WHERE user_id = ?;
```

**Çözüm:**

```sql
SELECT users.*, posts.* 
FROM users 
JOIN posts ON users.id = posts.user_id;
```

**Fayda:** Gereksiz sorgu sayısını azaltır ve verileri tek bir sorguda çeker.

### 2. **Eager Loading ile ORM’lere Güvenin**

ORM’lerinizi doğru ayarlarsanız, *Eager Loading* özelliği işinizi kolaylaştırır. Örneğin, Laravel’de `with` metodu:

```php
// Problemli
$users = User::all();
foreach ($users as $user) {
    $user->posts;
}

// Çözüm
$users = User::with('posts')->get();
```

ORM artık veriyi tek bir sorguda getirir ve performans canavarı olmaktan çıkar.

### 3. **Query Profiling ile Durumu İzleyin**

Her zaman sorgularınızı analiz edin. MySQL'de `EXPLAIN` komutunu kullanarak sorgularınızın nasıl çalıştığını ve hangi indekslerin kullanıldığını inceleyebilirsiniz:

```sql
EXPLAIN SELECT users.*, posts.* 
FROM users 
JOIN posts ON users.id = posts.user_id;
```

Bu araç, performansı etkileyen sorunları tespit etmenizi sağlar.

## **Kral Katili ORM’ler ve MySQL’in Kılıcı**

ORM'ler, geliştirme hızınızı artıran mükemmel araçlardır, ancak yanlış kullanıldığında performans katili haline gelebilir. N+1 Sorgu Problemi’ni çözmek için **Join**, **Eager Loading** ve **Query Profiling** yöntemlerini kullanarak veritabanınıza düzen getirin.

Unutmayın: **"Kaos bir merdivendir,"** ama MySQL için değil! Sorgularınızı optimize edin ve veri tabanı performansınızı kral gibi yönetin. 😉

<div class="video_wrapper"><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HDjNcqQs1yM?si=sFlKEk1FdXXI497A&start=106" title="YouTube video player" width="560"></iframe></div>
