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):
EXPLAINkullanarak 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
JOINtürleri kullanma. WHEREkoşullarını basitleştirme.- İndekslenmiş sütunlarda
WHEREkoşullarında fonksiyon kullanmaktan kaçınma. GROUP BYveORDER BYoptimizasyonu.
- 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ı:
LIMITkullanarak 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.