Özelliği yayınlarsın, dizüstü bilgisayarında çalışır, sonra production'da bir endpoint üç saniye sürer. Suçlunun bir sorgu olduğunu zaten biliyorsun. Bilmediğin, sorgunun hangi kısmı olduğu; bunu sana söylemesi gereken araç ise gözlerini kısarak bakman gereken sayılarla dolu, girintili bir metin duvarı veriyor.
O metin duvarı bir EXPLAIN planı ve cevabın tamamı onun içinde. Veritabanı sorgunu tam olarak nasıl çalıştıracağını düğüm düğüm, her birinin üzerinde bir maliyetle anlatıyor. Sorun formatta. Ham bir plan yoğundur, derin iç içedir ve cuma günü saat 16:00'da onu okuyan bir insan için değil, bir ayrıştırıcı için optimize edilmiştir. Bu yüzden çoğumuz "Seq Scan" kelimesini ararız, belli belirsiz bir korku hisseder ve geçeriz.
Sorgu planı ağacı: metin kılığına girmiş bir ağaç
Her EXPLAIN planı aslında bir ağaçtır. Kök nihai sonuçtur, çocukları onu besleyen adımlardır ve her adım tahmini bir maliyet taşır. Onu metin olarak döktüğünde bu yapı girintilere düzleşir ve gerçekten önemsediğin tek şey (zamanın nereye gittiği) satırların, genişliklerin ve döngü sayılarının arasında kaybolur.
Çözüm, ağacı metin olarak okumayı bırakıp onu bir ağaç olarak görmeye başlamak. Önce makine dostu biçimi iste:
-- Postgres: ask for JSON so the plan keeps its structure EXPLAIN (ANALYZE, FORMAT JSON) SELECT u.name, count(o.id) FROM users u JOIN orders o ON o.user_id = u.id WHERE o.created_at > '2026-01-01' GROUP BY u.name;
Postgres (ve kendi FORMAT=JSON seçeneğiyle MySQL) her zamanki metin yerine bir JSON dokümanıyla yanıt verir. Şöyle görünür ve açıkçası elle okumak için pek de dostane değildir:
[{ "Plan": {
"Node Type": "Hash Join",
"Total Cost": 18422.6,
"Plans": [
{ "Node Type": "Seq Scan",
"Relation Name": "orders",
"Total Cost": 15903.0 },
{ "Node Type": "Index Scan",
"Relation Name": "users",
"Total Cost": 211.4 }
] } }]
Postgres ve MySQL EXPLAIN görselleştirici: yapıştır, yavaş kısım parlasın
O JSON'u kopyala, LetDraw'un Koddan Oluştur penceresini aç ve yapıştır. Neye baktığını ona söylemene gerek yok. LetDraw bir Postgres ya da MySQL EXPLAIN planını otomatik algılar ve onu ısı haritalı bir plan ağacı olarak çizer: gerçek ağaç, açılmış halde, her düğüm maliyetine göre renklendirilmiş.
En pahalı düğüm en kırmızı olanıdır. Bütün inceleme tek bakışta.
Sıcak düğümler kırmızı ve turuncu parlar; ucuz olanlar yeşil kalır. Böylece maliyetleri gözle ayrıştırmak yerine resme bakarsın ve dikkatin doğrudan darboğaza gider.
orders üzerindeki kırmızı Seq Scan işin neredeyse tamamını yapıyor; users tarafı zaten indeksli.Artık teşhis apaçık. orders tarafı bir Seq Scan, yani tablonun tamamen okunması; users ise zaten bir Index Scan ile karşılanıyor. En üstteki pahalı hash join, o tam tarama tarafından beslendiği için pahalı. orders(created_at) üzerindeki eksik indeks, bir maliyet sütunundan çıkardığın bir sonuç değil; sayfadaki tek kırmızı kutu.
Sorgun tarayıcıdan hiç çıkmaz
Veritabancıların genellikle ilk sorduğu kısım bu. Bir EXPLAIN planı, rastgele bir web aracına vermek istemeyeceğin tablo adlarını, sütun adlarını ve satır tahminlerini açığa çıkarabilir. LetDraw her şeyi istemci tarafında çalıştırır. Ayrıştırma ve yerleşim senin tarayıcında, senin makinende gerçekleşir. Resmi oluşturmak için sorgun ya da şemanla ilgili hiçbir şey bir sunucuya yüklenmez.
- Production veritabanından bir planı, dizüstü bilgisayarından çıkmadan yapıştır
- Bir planı ağaca dönüştürmek için hesap ya da yükleme gerekmez
- Barındırılan uygulamayı da kullansan, self-host da etsen aynı gizlilik geçerlidir
EXPLAIN (ANALYZE) kullan. Maliyetler tahmin olmaktan çıkıp ölçülmüş sürelere dönüşür ve ısı haritası, planlayıcının tahmin ettiği yeri değil, zamanın gerçekten gittiği yeri yansıtır.Bir diyagram olduğu için üzerinde aksiyon alabilirsin
Plan ağacı statik bir görsel değil. LetDraw'daki her şeyle aynı düzenlenebilir şekillerden oluşur; yani sorunu fark ettiğin anda onu bir ekip arkadaşının anlayacağı bir şeye dönüştürebilirsin.
- Sıcak yolu daire içine al ve eksik indeksi açıklayan bir not bırak
- Düzeltmenin işe yaradığını göstermek için önceki ve sonraki planları yan yana yapıştır
- PNG, SVG ya da PDF olarak dışa aktar ve pull request'e veya olay raporuna ekle
Ham bir plan, tek bir mühendisin tek başına çözdüğü bir şeydir. Kırmızı kutunun üzerinde notu olan ısı haritalı bir ağaç ise bütün incelemenin birkaç saniyede anladığı bir şeydir. "Yavaş sorgu var" ile "yavaş kısım burası, tek satırlık düzeltme de bu" arasındaki fark budur. Bir sonraki EXPLAIN planını yapıştır ve darboğaz kendini tanıtsın.