How-To Guides

Yavaş SQL Sorgularını Nasıl Optimize Edersiniz: Geliştiriciler İçin Pratik Bir Kılavuz

Veritabanı performansı, yüksek trafikli her uygulamanın omurgasıdır. SQL sorguları yavaş çalıştığında kullanıcılar zaman aşımı yaşar, sunucu kaynakları artar ve kullanıcı bağlılığı düşer. Orta ve ileri düzey geliştiriciler için bu sorguları nasıl optimize edeceğinizi anlamak sadece bir iyi uygulama değil, kritik bir beceridir. Bu kılavuzda darboğazları belirlemek ve verimli SQL yazmak için en etkili stratejileri inceleyeceğiz.

1. Çalıştırma Planını Anlayın

Optimize etmeden önce teşhis koymalısınız. Çoğu veritabanı motoru, bir sorguyu nasıl çalıştırmayı planladığını gösteren bir araç sağlar. MySQL ve PostgreSQL'de bu genellikle EXPLAIN komutu kullanılarak yapılır. Çalıştırma planı, tablo erişim yöntemi (tam tablo taraması vs. indeks araması), incelenmesi planlanan tahmini satır sayısı ve birleştirme (join) sırası gibi kritik ayrıntıları ortaya koyar.

Tam tablo taraması genellikle ilk kırmızı bayraktır. Bu, veritabanının eşleşen kayıtları bulmak için tablodaki her satırı okuduğu anlamına gelir. Bu, büyük veri kümeleri için son derece pahalıdır.


EXPLAIN SELECT * FROM orders WHERE customer_id = 123;

Çıktı type: ALL (MySQL'de) gösteriyorsa, tam bir tarama olduğunu belirtir. Amacınız bunu type: ref veya type: const olarak değiştirmektir.

2. İndeksleme Stratejisi

İndeksler, okuma işlemlerini hızlandırmak için en etkili tek yoldur. Bir indeksi bir kitabın içerik tablosu gibi düşünün. Her sayfayı çevirmek (tablo taraması) yerine, doğrudan ilgili bölüme atlar.

İndeksleme İçin En İyi Uygulamalar:

  • Filtre sütunlarını indeksleyin: Bir sorgu WHERE status = 'active' ile filtreliyorsa, status sütununun indekslenmiş olduğundan emin olun.
  • Bileşik İndeksler: Sık sık iki sütuna göre sorgu yapıyorsanız, bir bileşik indeks oluşturun. Sıranın önemli olduğunu unutmayın. Sorgunuz WHERE customer_id = 100 AND order_date > '2023-01-01' ise, indeks (customer_id, order_date) olmalıdır.
  • Aşırı İndekslemeden Kaçının: İndeksler okumaları hızlandırırsa da, indeksin güncellenmesi gerektiği için yazma işlemlerini (INSERT/UPDATE/DELETE) yavaşlatır. Sadece arama koşullarında sık kullanılan sütunları indeksleyin.

CREATE INDEX idx_customer_status ON orders (customer_id, status);

3. SELECT * Kullanmaktan Kaçının

SELECT * kullanmak, veritabanının her eşleşen satır için tüm sütunları getirmesini zorlar. Bu, I/O, ağ trafiği ve bellek kullanımını artırır. Sadece üç sütuna ihtiyacınız olsa bile, veritabanı 20 sütunu okumak zorunda kalabilir. Her zaman ihtiyacınız olan tam sütunları belirtin.


-- Kötü
SELECT * FROM users WHERE email = 'test@example.com';

-- İyi
SELECT id, name, email FROM users WHERE email = 'test@example.com';

4. Birleştirmeleri (Joins) ve Alt Sorguları Optimize Edin

Karmaşık birleştirmeler, doğru şekilde ele alınmazsa performans kabusuna dönüşebilir. Birleştirme sütunlarının her iki tabloda da indekslenmiş olduğundan emin olun. Ayrıca, veritabanı optimizasyoncunun yeteneklerine bağlı olarak bir alt sorgunun bir birleştirmeye, veya tam tersine, dönüştürülüp dönüştürülemeyeceğini değerlendirin.

Çok sayıda durumda, optimizasyoncunun işlemleri yeniden sıralama konusunda daha fazla esnekliğe sahip olması nedeniyle JOIN'ler, alt sorgulardan daha verimlidir. Ancak, korelasyonlu alt sorgulardan tamamen kaçınılmalıdır, çünkü bunlar dış sorgudaki her satır için iç sorguyu çalıştırabilir.

5. Veri Türü Eşleşmemelerini Kontrol Edin

İnce ama yaygın bir sorun, örtük tür dönüşümüdür. Bir metin sütununu bir tam sayıyla karşılaştırırsanız (ör. WHERE phone_number = 5551234), veritabanı karşılaştırma için sütun değerlerini tam sayılara dönüştürmek zorunda kaldığı için phone_number üzerindeki indeksi kullanmayabilir; bu da indeksi devre dışı bırakır. WHERE koşullarınızda veri türlerinin eşleştiğinden her zaman emin olun.

Sonuç

SQL sorgu optimizasyonu, iteratif bir süreçtir. Profil oluşturma ile başlayın, darboğazları belirlemek için çalıştırma planlarını kullanın, hedefli indeksleme uygulayın ve sorgu yapınızı ince ayar yapın. Bu uygulamaları benimseyerek veritabanı yükünü önemli ölçüde azaltabilir ve uygulama yanıt süresini iyileştirebilirsiniz. Unutmayın: Önce ölçün, sonra optimize edin ve değişiklikleri her zaman gerçek dünya verileriyle doğrulayın.

Share: