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.