İçeriğe geç
KURUMSAL Kurumsal teknoloji · İşletmenize özel mühendislik Kurumsal Yazılım · Yönetilen Sunucular · Kurumsal E-posta · LiteSpeed + CloudLinux · Imunify360 Güvenlik · cPanel Yönetim · Uygun pakette 3 Gbps'ye kadar ağ profili
AIOR

Veritabanı Performansı: İndeks, Sorgu Planı ve Donanımdan Önce İnce Ayar

  • Konu başlatıcısı Konu başlatıcısı Aior
  • Başlangıç tarihi Başlangıç tarihi

Aior

Administrator

Yetkili üye
Katıldı
2 Nis 2023
Mesajlar
929
Tepki puanı
2
Puan
18
Yaş
41
Konum
Turkey
Web sitesi
aior.com
Konu sahibi

Yavaş database'e donanım atmak en pahalı çözümdür​

Database performans sorunları genellikle yazılımda (sorgular, indeksler, schema) donanımdan (daha büyük instance, daha fazla bellek) çok daha ucuza düzeltilebilir.

EXPLAIN, sonra EXPLAIN ANALYZE​

Her yavaş sorgu başka bir eylem öncesi EXPLAIN'lenir.

Aranacak:
  • Büyük tabloda sequential scan — genellikle eksik indeks.
  • Büyük tablolarda nested loop — kötü join sırası.
  • Büyük satır taramalı Sort + Limit deseni.
  • Disk'e dökülen hashtable ile hash join — work_mem çok küçük.
  • Bitmap heap scan.

Indeksler — doğruları, hepsi değil​

  • B-tree — varsayılan. Equality ve range için.
  • Composite — multi-column. Sıra önemli.
  • Partial — predicate eşleşen satırları indeksle.
  • Expression — kolon fonksiyonu indeksi.
  • GIN / GIST — full-text, JSONB, geospatial için.

Indekslerin maliyeti​

Indeksler okumayı hızlandırır, yazmayı yavaşlatır. Sorgu başına bir indeks ekleyen ekip write-bottleneck biriktirir.

Karşılığını veren sorgu desenleri​

  • ORDER BY ile LIMIT indeks kullanır.
  • "Eşleşen herhangi bir satır" için IN yerine EXISTS.
  • SELECT *'tan kaçının.
  • Büyük veri setlerinde OFFSET'ten kaçının — cursor tabanlı pagination kullanın.
  • Prepared statement'lar kullanın.
  • Batch INSERT'lar.
  • Bulk yüklemeler için COPY.

N+1 sorguları​

Uygulama öğe listesi yükler, sonra her öğe için ayrı sorgu yapar. 1 JOIN'lu sorgu yerine 1+N sorgu.

Düzeltme uygulama düzeyinde (eager loading, JOIN, child sorgu batch).

Cache hit oranları​

Postgres için:
  • Buffer cache hit oranı — sağlıklı OLTP'de >%99 olmalı.
  • Index cache hit oranı — aynı hedef.

Locking ve contention​

  • Yavaş sorgu log'unda lock waits = contention.
  • Uzun süren transaction'lar lock tutar.
  • Update-ağır hotspot'lar → farklı tasarım düşünün.

Vacuum ve bloat​

Postgres için:
  • Vacuum dead tuple'lardan alan geri alır.
  • Autovacuum varsayılan açık.
  • Bloat — pg_repack veya VACUUM FULL.

Bağlantı maliyetleri​

  • Connection pooling (Postgres için pgBouncer).
  • Uygulama bağlantı havuzları gerçekçi eş zamanlı aktif sorgulara göre boyutlandırılır.

Donanım son kaldıraç olarak​

  • Daha fazla RAM.
  • Daha hızlı diskler (NVMe).
  • Daha fazla CPU.

Deneyimimize göre, "database yavaş" sorunlarının ~%80'i yazılım katmanında çözülür.

Uyaracağımız bir desen​

"Daha çok indeks = daha hızlı sorgu" diye kör indeks ekleme.

Her zaman karşılığını veren bir desen​

Haftalık yavaş-sorgu incelemesi.

Gönderdiğiniz en şaşırtıcı performans düzeltmesi nedir?


Throwing hardware at a slow database is the most expensive solution​

Database performance issues are usually fixable in software far cheaper than in hardware.

EXPLAIN, then EXPLAIN ANALYZE​

Every slow query gets EXPLAIN'd before any other action.

What to look for:
  • Sequential scan on a large table — usually missing index.
  • Nested loop on big tables — poor join order.
  • Sort + Limit with large rows scanned.
  • Hash join with hashtable spilling — work_mem too small.
  • Bitmap heap scan.

Indexes — the right ones​

  • B-tree — default.
  • Composite — multi-column. Order matters.
  • Partial — index only rows matching a predicate.
  • Expression — index on function of a column.
  • GIN/GIST — for full-text, JSONB, geospatial.

The cost of indexes​

Indexes speed reads and slow writes.

Query patterns that help​

  • LIMIT with ORDER BY uses indexes.
  • EXISTS over IN.
  • Avoid SELECT *.
  • Avoid OFFSET on large datasets.
  • Use prepared statements.
  • Batch INSERTs.
  • COPY for bulk loads.

N+1 queries​

The application loads a list, then makes a separate query per item. Fix at application level.

Cache hit ratios​

For Postgres:
  • Buffer cache hit ratio — >99% on healthy OLTP.
  • Index cache hit ratio — same target.

Locking and contention​

  • Lock waits = contention.
  • Long transactions hold locks.
  • Update-heavy hotspots → different design.

Vacuum and bloat​

For Postgres:
  • Vacuum reclaims dead tuple space.
  • Autovacuum on by default.
  • Bloat — pg_repack or VACUUM FULL.

Connection costs​

  • Connection pooling (pgBouncer).
  • Pools sized for realistic concurrent queries.

Hardware as last lever​

  • More RAM.
  • Faster disks (NVMe).
  • More CPU.

~80% of "slow database" issues resolve at software layer.

One pattern we'd warn about​

Adding indexes blindly.

One pattern that always pays off​

A weekly slow-query review.

What's the most surprising performance fix you've shipped?
 

Forum istatistikleri

Konular
925
Mesajlar
932
Üyeler
26
En son üye
Jessicawatson

Çevrimiçi üyeler

Şu anda çevrimiçi üye yok.

Öne çıkan içerik

AIOR
AIOR TEKNOLOJİ

Tüm ihtiyaçlarınız için Teklif alın

Hosting · Domain · Sunucu · Tasarım · Yazılım · Mühendislik · Sektörel Çözümler

Teklif al

7/24 Destek · Anında yanıt

Geri
Üst