ChatGPT

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.

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.
VERITABANI SORGU PLAN TABLO_BILGISI
ChatGPT'de Aç
134 kez kopyalandı

Ö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.
Reklam
İleri SeviyeKurumsal

Yorumlar (0)

Henüz yorum yok

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

Yorum yapmak için giriş yap