SQL Notları: Performans İpuçları ve Optimizasyon

MySQL, büyük veri kümeleri üzerinde çalışırken performansı artırmak için çeşitli optimizasyon teknikleri sunar. Bu yazıda, **bileşik indeksler**, **sorgu optimizasyonu** ve **depolama düzeni** ile ilgili temel bilgileri ve kullanım örneklerini ele alacağız.

---

### Bileşik İndeks Oluşturma

Bileşik indeksler, birden fazla sütun üzerinde tanımlanır ve belirli sorguların performansını önemli ölçüde artırabilir. İdeal bir bileşik indeks oluşturmak için sütunları aşağıdaki sırayla ekleyin:

1. **WHERE Koşulundaki Sütunlar:** Örneğin, `WHERE a = 12 AND b = 'xyz'` için `INDEX(a, b)`.
2. **IN Koşulundaki Sütunlar:** Optimizatör, indeks üzerinde hızlı atlamalar yapabilir.
3. **Aralık Koşulları:** Örneğin, `x BETWEEN 3 AND 9` veya `name LIKE 'J%'`. İndeks, ilk aralık sütunundan sonrasını kullanmaz.
4. **GROUP BY Sütunları:** Gruplama sütunlarını sırayla ekleyin.
5. **ORDER BY Sütunları:** Sıralama sütunlarını sırayla ekleyin. Tüm sütunlar `ASC` veya `DESC` olmalıdır.

#### Örnek:
```sql
CREATE INDEX idx_composite ON my_table (a, b, c);
```

Bu indeks, aşağıdaki sorgular için kullanılabilir:
```sql
SELECT * FROM my_table WHERE a = 12 AND b = 'xyz';
SELECT * FROM my_table WHERE a = 12 ORDER BY c;
```

---

### Sorgu Optimizasyonu

#### 1. **Fonksiyonlar İçinde İndeksli Sütunları Kullanmaktan Kaçının**
Fonksiyonlar içinde indeksli sütunları kullanmak, indeksin kullanılmasını engeller. Örneğin:
```sql
WHERE DATE(dt) = '2000-01-01'  -- İndeks kullanılmaz
```
Bunun yerine:
```sql
WHERE dt >= '2000-01-01' AND dt < '2000-01-02'  -- İndeks kullanılır
```

#### 2. **OR Koşulları**
`OR` koşulları, optimizasyonu zorlaştırır. Örneğin:
```sql
WHERE a = 12 OR b = 78  -- İndeks kullanımı zor
```
Bunun yerine:
```sql
WHERE a IN (12, 78)  -- İndeks kullanılabilir
```

#### 3. **Alt Sorgular**
Alt sorgular, özellikle ilişkili (correlated) alt sorgular, performansı etkileyebilir. Örneğin:
```sql
SELECT a, b, (SELECT MAX(x) FROM t WHERE t.x = u.x) AS c FROM u;
```
Bu tür sorgular, `LEFT JOIN` ile değiştirilebilir ve daha hızlı çalışabilir.

---

### Depolama Düzeni Optimizasyonu

#### 1. **Uzun PRIMARY KEY'lerden Kaçının**
Uzun bir PRIMARY KEY, disk alanını boşa harcar ve ikincil indekslerde de yer kaplar. Bunun yerine `AUTO_INCREMENT` kullanın.

#### 2. **VARCHAR Kullanımı**
Değişken uzunluklu metinler için `VARCHAR` kullanın. `CHAR(N)` her zaman `N` karakter yer kaplar, oysa `VARCHAR` sadece gerektiği kadar yer kullanır.

#### 3. **COMPRESSED Satır Formatı**
Büyük tablolar veya tekrarlanan veriler için `COMPRESSED` satır formatını kullanın. Bu, disk I/O'yu azaltır ve performansı artırır.

#### 4. **OPTIMIZE TABLE**
Tablo boyutu stabilize olduğunda veya büyük miktarda veri eklendiğinde `OPTIMIZE TABLE` kullanarak tabloyu yeniden düzenleyebilir ve boş alanı sıkıştırabilirsiniz. Ancak bu işlem maliyetlidir ve nadiren kullanılmalıdır.

---

### Performansı Artırmak İçin Diğer İpuçları

- **innodb_buffer_pool_size:** Bu değer, mevcut RAM'in yaklaşık %70'i olarak ayarlanmalıdır.
- **Prefix İndeksler:** Örneğin, `INDEX(foo(20))` gibi önek indeksler genellikle faydasızdır ve performansı düşürebilir.
- **PARTITIONing:** PARTITIONing nadiren performans avantajı sağlar ve bazen performansı düşürebilir.

---

### Rezerve Kelimeler ve Hatalar

MySQL'de bazı özel kelimeler (örneğin, `ORDER`, `GROUP`) rezerve edilmiştir. Bu kelimeleri tablo veya sütun adı olarak kullanırken backtick (`) ile çevrelemeniz gerekir:

```sql
SELECT * FROM `order`;  -- Rezerve kelime kullanımı
```

---

### Sonuç

MySQL'de performansı artırmak için doğru indeksleme, sorgu optimizasyonu ve depolama düzeni stratejileri kullanılmalıdır. Bileşik indeksler, sorguların hızını önemli ölçüde artırabilirken, `OR` koşulları ve fonksiyonlar içinde indeksli sütunlar kullanmaktan kaçınmak da performansı korur. Ayrıca, depolama düzeni optimizasyonu ve doğru yapılandırma ayarları, veritabanının genel performansını artırabilir.

Önceki Yazı
Her DBA'nın Bilmesi Gereken Temel Komutlar

UNIX komutları, DBA'lar için günlük işlerini kolaylaştıran güçlü araç...

Sonraki Yazı
SQL Notları: Kullanıcı Yönetimi ve Şifre Değiştirme

MySQL'de kullanıcı yönetimi ve şifre değiştirme işlemleri, veritabanı g�...