Yavaş SQL Sorgusunu Hızlandırma: Plan, İndeks ve Yeniden Yazım

Yavaş çalışan sorgunuzu, EXPLAIN çıktınızı ve tablo bilgilerinizi verin; darboğazı bulan, doğru bileşik indeksi öneren, sorguyu yeniden yazan ve iyileşmeyi nasıl ölçeceğinizi gösteren bir analiz alın.

YZ Admin Güncellendi: 26 Eylül 2026 0 yorum

Prompt

Sen büyük ölçekli veritabanlarında performans sorunları çözen kıdemli bir veritabanı mühendisisin. Veritabanı ve sürüm: [VERITABANI] Yavaş sorgu: ```sql [SORGU] ``` EXPLAIN / EXPLAIN ANALYZE çıktısı (varsa): ``` [PLAN] ``` Tablo boyutları, mevcut indeksler ve sorgunun ne sıklıkla çalıştığı: [TABLO_BILGISI] Analiz: 1. Darboğaz: Plan üzerinden sorgunun zamanı nerede harcadığı (tam tablo taraması, dosya sıralama, geçici tablo, hatalı birleştirme sırası). 2. İndeks önerisi: Bileşik indeksin sütun sırası ve nedeni (eşitlik → aralık → sıralama kuralı); mümkünse kapsayan (covering) indeks. CREATE INDEX komutu. 3. Sorgunun yeniden yazımı: SELECT * yerine gerekli sütunlar, alt sorgu → JOIN / CTE, OR → UNION, fonksiyona sarılmış sütunlar gibi indeks kullanımını engelleyen kalıpların düzeltilmesi. 4. Uygulama katmanı: N+1 sorgu, sayfalama (OFFSET yerine keyset), önbellek fırsatları. 5. Ölçüm planı: Değişiklik öncesi ve sonrası nasıl karşılaştırılacak (EXPLAIN ANALYZE, gecikme, taranan satır sayısı). 6. Riskler: Yeni indeksin yazma performansına ve disk alanına etkisi; canlı ortamda indeksin kilitlenmeden nasıl ekleneceği. Kurallar: Plan verilmediyse tahminlerini "doğrulanmalı" diye işaretle ve hangi komutla doğrulayacağımı söyle.

Doldurulacak alanlar 4

[VERITABANI]
Veritabanı motoru ve sürümü Örn. MySQL 8.0
[SORGU]
Yavaş çalışan SQL sorgusu Örn. SELECT * FROM orders WHERE DATE(created_at) = CURDATE() AND status = 'pending' ORDER BY created_at DESC
[PLAN]
EXPLAIN çıktısı Örn. type: ALL, rows: 4800000, Extra: Using where; Using filesort
[TABLO_BILGISI]
Tablo boyutu, indeksler ve kullanım sıklığı Örn. orders 4,8 milyon satır, sadece PRIMARY KEY var; sorgu yönetim panelinde dakikada ~30 kez çalışıyor

Örnek çıktı

1. Darboğaz: type: ALL → 4,8 milyon satırın tamamı taranıyor. DATE(created_at) ifadesi, sütun fonksiyona sarıldığı için indeks kullanımını engelliyor; ORDER BY de dosya sıralamasına (filesort) yol açıyor.

2. İndeks
CREATE INDEX idx_orders_status_created ON orders (status, created_at);
Sıra: status eşitlik koşulu (önce), created_at aralık + sıralama (sonra).

3. Yeniden yazım
SELECT id, customer_id, total, created_at
FROM orders
WHERE status = 'pending'
AND created_at >= CURDATE()
AND created_at < CURDATE() + INTERVAL 1 DAY
ORDER BY created_at DESC;

Beklenen plan: type: range, taranan satır: yalnızca bugünün bekleyen siparişleri, filesort yok.

6. Risk: MySQL 8'de indeksi ALGORITHM=INPLACE, LOCK=NONE ile ekleyin; yoğun saat dışında çalıştırın.
ChatGPT'de Aç Yerel modelimde dene
İleri SeviyeKurumsal

Topluluk denemeleri (0)

Bu promptla üretilen görseller. Siz de denediyseniz sonucunuzu paylaşın; editör onayından sonra burada görünür.

Paylaşmak için giriş yap

Henüz paylaşılan deneme yok. İlk sonucu siz paylaşın.

Yorumlar (0)

Henüz yorum yok

Promptu denediyseniz deneyiminizi veya geliştirme önerinizi paylaşın.

Yorum yapmak için giriş yap