İndekslenmemiş Bir Sütun Veritabanımızı Nasıl Çökertti
Tek bir eksik indeks, 8 ms'lik bir API'yi 8 saniyelik bir kabusa dönüştürdü.
Büyük bir sürüm öncesinde yük testi gerçekleştirdik. Yerel geliştirme ortamında 100 satır sorunsuz çalışıyordu. Staging ortamında ise 1,5 milyon satıra karşı 500 kullanıcıyı simüle ettik.
Her şey çöktü.
- API yanıt süreleri 45 ms'den 8.000 ms'ye fırladı.
- Veritabanı CPU kullanımı %100'e ulaştı.
- Bağlantı havuzları tükendi.
- İstekler zaman aşımına uğradı.
Suçlu, user_id ve status değerlerine göre sipariş geçmişini getiren basit bir sorguydu.
PostgreSQL üzerinde EXPLAIN ANALYZE çalıştırmak bir Sequential Scan gösterdi. user_id üzerinde bir indeks olmadığı için motor, her istek için 1,5 milyon satırın tamamını okuyordu.
100 eşzamanlı istekte veritabanı tek seferde 150 milyon satırı taradı.
Çözüm sadece beş dakika sürdü. Tablonun çevrimiçi kalmasını sağlamak için CREATE INDEX CONCURRENTLY kullanarak (user_id, status, created_at DESC) üzerinde bir bileşik (composite) indeks oluşturduk.
Sonuçlar:
- Sorgu süresi 8.150 ms'den 0,14 ms'ye düştü.
- API gecikmesi 8 saniyeden 12
