Sobes.tech
Middle

Sorguları optimize etmek zorunda kaldınız mı?

sobes.tech yapay zeka

AI'dan gelen yanıt

Evet, bunu yapmak zorunda kaldım. Sorgu optimizasyonu, yüksek performanslı uygulamaların geliştirilmesinde önemli bir parçadır.

Deneyimim şunları içerir:

  • Sorgu yürütme planını analiz etme (EXPLAIN): EXPLAIN kullanarak veritabanının sorguyu nasıl yürüttüğünü, hangi indekslerin kullanıldığını ve darboğazların nerede olduğunu anlama.
  • İndeks oluşturma ve optimize etme: Sık kullanılan sütunlara uygun indeksler ekleme ve filtreleme, sıralama ve birleştirmeleri hızlandırmak için birleşik indeksler oluşturma. Kullanılmayan veya yinelenen indeksleri kaldırma.
  • Verimsiz sorguları yeniden yazma:
    • SELECT * yerine belirli sütunları seçme.
    • Uygulama seviyesinde alt sorgular veya iç içe döngüler yerine daha uygun JOIN türleri kullanma.
    • WHERE koşullarını basitleştirme.
    • İndekslenmiş sütunlarda WHERE koşullarında fonksiyon kullanmaktan kaçınma.
    • GROUP BY ve ORDER BY optimizasyonu.
  • Normalizasyon/denormalizasyon: Normalizasyon uygulayarak fazlalığı azaltma veya bazı durumlarda, veriyi çoğaltma veya toplulaştırılmış sütunlar oluşturarak okuma hızını artırma (dikkatli olunmalı).
  • Sorgu sonuçlarını önbelleğe alma: Uygulama seviyesinde önbellekleme veya veritabanı önbellekleme mekanizmaları (örneğin Redis, Memcached) kullanarak sık sorgulanan ve nadiren değişen verilerin okunmasında veritabanı üzerindeki yükü azaltma.
  • Veri seçim sınırlandırması: LIMIT kullanarak sayfalama veya sadece gerekli kayıt sayısını seçme.
  • İzleme ve profil çıkarma: Yavaş sorguları tespit etmek için izleme araçları (örneğin, Percona Monitoring and Management, phpMyAdmin ile etkinleştirilmiş Slow Query Log) kullanma.

EXPLAIN ile analiz örneği:

// Durumu `status` sütununda indeks olmayan yavaş sorgu örneği
SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();

// Plan analizi
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Tam tablo taraması (ALL) veya uygun indeks kullanılmıyor olabilir.

// Her iki sütuna da birleşik indeks ekleme
CREATE INDEX idx_status_created_at ON orders (status, created_at);

// İndeks oluşturulduktan sonra tekrar analiz
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Tip (type) ref veya range olarak değişmeli ve Extra "Using where;" içermeli.