ofyilmaz
kurumsal
Bir yazılım projesi geliştirirken veritabanı kurulumunu yapıp geçiyoruz, değil mi? Başta her şey hızlı hızlı çalışıyor. Ama işler büyüyüp kullanıcılar artınca bir anda sorgular yavaşlıyor, sistem kilitlenmeye başlıyor. İşte tam da burada, doğru veritabanı tasarımı ve performans iyileştirmeleri devreye giriyor.
Bu yazıda sadece teorik bilgilerden değil, gerçek hayatta karşılaştığımız sorunlardan ve bunlara nasıl çözümler bulduğumuzdan da bahsedeceğiz. İndeks kullanımından sorgu optimizasyonuna, cache yöntemlerinden doğru normalizasyon kararlarına kadar pek çok kritik noktaya değineceğiz.
Hedefimiz: hem daha hızlı sistemler kurmak, hem de gelecekte başımızı ağrıtacak problemleri şimdiden önlemek.
Biraz daha derine girecek olursak.
Akıllı İndeksleme: "İndex mi? O da neydi?" Demeyelim
Veritabanlarında indeksler, kütüphanedeki kitap kataloğu gibidir. Kitabın adını aramak yerine tüm rafları gezmek mi daha kolay, yoksa kataloğa bakıp doğru rafa yönelmek mi?
Tabii ki indeksler!
İpucu: Eğer sorgularınızda belli kolonlara göre sık sık arama yapıyorsanız (örneğin kullanıcı adı veya ürün kodu), o kolonlara mutlaka indeks atayın.
Gerçek Hayattan: Bir e-ticaret sitesinde, sadece product_sku alanına indeks ekleyerek ürün arama süresini 4.3 saniyeden 0.18 saniyeye düşürdük.
Basit bir adım, devasa bir fark!
SQL yazarken çoğumuz hemen SELECT * FROM ... diye başlarız. Ama işin aslı öyle değil!
Kullanın: SELECT id, name, price FROM products gibi sadece gerekli alanları çekin.
Ekstra ipucu:
Gerçek Hayattan: Bir kullanıcı aktiviteleri raporunda, gereksiz sütunları kaldırarak SQL sorgusunu %50 daha hızlı çalışır hale getirdik.
Eğer bir veriye sürekli ihtiyaç varsa (örneğin ana sayfada görünen ürünler listesi gibi) her defasında veritabanına gitmek büyük israftır.
Öneri: Kullanıcı oturum bilgileri, ürün listeleri veya haber başlıkları gibi içerikleri cache'leyin.
Gerçek Hayattan: Ana sayfa ürün listesi sorgusunu cache'e alarak her sayfa yüklemesinde 300 ms kazandık. Üstelik veritabanı üzerindeki yük de %40 azaldı.
Küçük veri setlerinde normalizasyon önemlidir (disk alanı tasarrufu, veri bütünlüğü). Büyük veri setlerinde (milyonlarca satırda) denormalizasyon bazen sorgu hızını 10x arttırabilir.
Gerçek Hayattan: Kullanıcı favori ürünler tablosunu normalize etmek yerine, doğrudan kullanıcı tablosunda ufak bir JSON alanıyla tuttuk ve performans sorunlarını çözdük.
Bir projede sorguların yavaşlamasının nedeni, sadece tek bir kolonun eksik indekslenmesiydi. Basit bir CREATE INDEX komutuyla sistem %60 hızlandı.
Bir diğer projede cache sistemi kurmadığımız için, ana sayfa 1 saniyede değil 4 saniyede yükleniyordu. Cache ekleyince sunucu yükü %35 azaldı.
SELECT * kullanımı yüzünden bir veritabanı yedeği 70 GB'ye kadar çıkmıştı. Sadece gerekli alanları seçerek hem backup süresi hem de disk kullanımı ciddi şekilde düştü.
Veritabanı performansı, genellikle işin en başında önemsenmeyen ama sistem büyüdükçe can sıkan bir konu.
Doğru indeksler, doğru sorgular ve doğru mimari kararlar sistemi adeta roket gibi hızlandırıyor.
Peki siz veritabanı performansını artırmak için hangi yöntemleri kullanıyorsunuz?
Ya da yaşadığınız ilginç problemler oldu mu?
Sizde bizle kendi deneyimlerinizi paylaşabilirsiniz!
Bu yazıda sadece teorik bilgilerden değil, gerçek hayatta karşılaştığımız sorunlardan ve bunlara nasıl çözümler bulduğumuzdan da bahsedeceğiz. İndeks kullanımından sorgu optimizasyonuna, cache yöntemlerinden doğru normalizasyon kararlarına kadar pek çok kritik noktaya değineceğiz.
Hedefimiz: hem daha hızlı sistemler kurmak, hem de gelecekte başımızı ağrıtacak problemleri şimdiden önlemek.
Biraz daha derine girecek olursak.
Akıllı İndeksleme: "İndex mi? O da neydi?" Demeyelim

Veritabanlarında indeksler, kütüphanedeki kitap kataloğu gibidir. Kitabın adını aramak yerine tüm rafları gezmek mi daha kolay, yoksa kataloğa bakıp doğru rafa yönelmek mi?
Tabii ki indeksler!
- B-Tree İndeks: Çoğu SQL veritabanında default olarak kullanılan indeks türüdür. Sıralı veri aramalarında çok hızlı çalışır.
- Hash İndeks: Özellikle tam eşleşme (exact match) sorgularında (mesela WHERE email = '[email protected]') kullanılır, çok hızlı sonuç verir.
İpucu: Eğer sorgularınızda belli kolonlara göre sık sık arama yapıyorsanız (örneğin kullanıcı adı veya ürün kodu), o kolonlara mutlaka indeks atayın.
Gerçek Hayattan: Bir e-ticaret sitesinde, sadece product_sku alanına indeks ekleyerek ürün arama süresini 4.3 saniyeden 0.18 saniyeye düşürdük.
Basit bir adım, devasa bir fark!
Query Optimizasyonu: Küçük Değişiklik, Büyük Sonuçlar
SQL yazarken çoğumuz hemen SELECT * FROM ... diye başlarız. Ama işin aslı öyle değil!
- SELECT * demek, tablodaki tüm sütunları çağırmak demek. İhtiyacın olmayan veriler de geliyor ve bu da gereksiz yük demek.
- Onun yerine, gerçekten hangi alanlara ihtiyacın varsa sadece onları çağır.
Kullanın: SELECT id, name, price FROM products gibi sadece gerekli alanları çekin.
Ekstra ipucu:
- Sorgularda mutlaka filtre (WHERE koşulları) kullanın.
- JOIN yaparken sadece gerekli tabloları birleştirin, rastgele join atmaktan kaçının.
Gerçek Hayattan: Bir kullanıcı aktiviteleri raporunda, gereksiz sütunları kaldırarak SQL sorgusunu %50 daha hızlı çalışır hale getirdik.
Cache Kullanımı: Her Sorguyu Veritabanından İstemeyin
Eğer bir veriye sürekli ihtiyaç varsa (örneğin ana sayfada görünen ürünler listesi gibi) her defasında veritabanına gitmek büyük israftır.
- Redis veya Memcached gibi sistemlerle bu verileri hafızada tutabiliriz.
- Özellikle "sık değişmeyen" veriler için cache kullanmak sistemi uçurur.
Öneri: Kullanıcı oturum bilgileri, ürün listeleri veya haber başlıkları gibi içerikleri cache'leyin.
Gerçek Hayattan: Ana sayfa ürün listesi sorgusunu cache'e alarak her sayfa yüklemesinde 300 ms kazandık. Üstelik veritabanı üzerindeki yük de %40 azaldı.
Normalizasyon ve Denormalizasyon: Ne Zaman Hangisi?
- Normalizasyon: Veriyi tekrar etmeden tutmak için tabloları bölme sanatı.
- Denormalizasyon: Performans için bazen tekrar etmeyi göze alarak veriyi birleştirme.
Küçük veri setlerinde normalizasyon önemlidir (disk alanı tasarrufu, veri bütünlüğü). Büyük veri setlerinde (milyonlarca satırda) denormalizasyon bazen sorgu hızını 10x arttırabilir.

Gerçek Hayat Senaryoları: Başımıza Gelenler
Bir projede sorguların yavaşlamasının nedeni, sadece tek bir kolonun eksik indekslenmesiydi. Basit bir CREATE INDEX komutuyla sistem %60 hızlandı.
Bir diğer projede cache sistemi kurmadığımız için, ana sayfa 1 saniyede değil 4 saniyede yükleniyordu. Cache ekleyince sunucu yükü %35 azaldı.
SELECT * kullanımı yüzünden bir veritabanı yedeği 70 GB'ye kadar çıkmıştı. Sadece gerekli alanları seçerek hem backup süresi hem de disk kullanımı ciddi şekilde düştü.
Veritabanı performansı, genellikle işin en başında önemsenmeyen ama sistem büyüdükçe can sıkan bir konu.
Doğru indeksler, doğru sorgular ve doğru mimari kararlar sistemi adeta roket gibi hızlandırıyor.
Peki siz veritabanı performansını artırmak için hangi yöntemleri kullanıyorsunuz?
Ya da yaşadığınız ilginç problemler oldu mu?
Sizde bizle kendi deneyimlerinizi paylaşabilirsiniz!