Teknik

Veritabanın Aslında Yavaş Değil, Sana Yanlış Soruyor: E-Pin Scriptinde Gizlenen Sorgu Tıkanıklığını 20 Dakikada Teşhis Etme Yöntemi

E-pin scriptinde veritabanı yavaşlığını slow query log, EXPLAIN ve kilit analiziyle teşhis etmenin ve kalıcı çözmenin adım adım pratik rehberi.

Veritabanın Aslında Yavaş Değil, Sana Yanlış Soruyor: E-Pin Scriptinde Gizlenen Sorgu Tıkanıklığını 20 Dakikada Teşhis Etme Yöntemi

Site yavaşladığında ilk refleks neredeyse hep aynıdır: hosting paketini büyütmek. Oysa e-pin ve dijital ürün satan sitelerde yavaşlığın büyük kısmı kaynak darlığından değil, tek bir kötü sorgudan gelir. Çoğu satıcı bunu bilmez, çünkü panelde gördüğü tek şey "sayfa yavaş açılıyor" şikâyetidir. Sunucu grafiklerine bakar, CPU'yu düşük görür, "demek ki sunucu yetiyor" der ve sorunu tema ya da eklenti sanır.

Gerçeği şöyle özetleyebiliriz: veritabanı yavaş değildir, ona yanlış soru soruluyordur. Aynı tabloya saniyede otuz kez sorulan, indeks kullanmayan ve yüz binlerce satırı tarayan bir sorgu, en pahalı sunucuyu bile dize getirir. Bu yazıda bir e-pin satış scripti üzerinde yavaşlığı tahminle değil ölçümle bulmayı, EXPLAIN çıktısında hangi üç satırın gerçekten önemli olduğunu ve indeks eklemenin ne zaman fayda yerine zarar verdiğini anlatıyoruz. Yöntemi uygulamak için veritabanı yöneticisi olman gerekmiyor; sırayı bilmek yeterli.

%72Yavaşlık şikâyetinin beş veya daha az sorgudan kaynaklanması
40xDoğru bileşik indeksin tipik sorgu hızlanması
%15Gereksiz indeksin yazma işlemine getirdiği ek yük
20 dkLog + EXPLAIN ile ilk teşhis için yeterli süre

Yavaşlığın kaynağı çoğu zaman sunucu değil, tek bir sorgu

Dijital ürün satışında veri hacmi küçük başlar, sonra sessizce büyür. Ürün tablosu binlerce satırda kalırken; sipariş, stok hareketi, bakiye işlemi, oturum kaydı ve API log tabloları milyonlara koşar. Ana sayfada "son satılanlar" ya da "stok durumu" gibi masum görünen bir bileşen, bu büyük tabloyu her ziyarette baştan sona taramaya başlar. İlk altı ay hiç fark edilmez, yedinci ayda site aniden ağırlaşır. Değişen kod değil, satır sayısıdır.

Bu yüzden teşhise "hangi sayfa yavaş" diye değil, "hangi sorgu ne kadar toplam süre harcıyor" diye başlamak gerekir. Tek çalışması 40 milisaniye süren ama sayfada 60 kez çağrılan bir sorgu, 900 milisaniye süren tek seferlik bir sorgudan çok daha zararlıdır. Sağlıklı bir dijital ürün satış yazılımı bu tekrarları görünür kılar; görünmüyorsa ilk işin ölçüm katmanını açmak olmalı.

Teşhisin ilk adımı: slow query log'u doğru okumak

Yavaş sorgu günlüğünü açarken en sık yapılan hata eşiği çok yükseğe koymaktır. Eşiği iki saniyeye ayarlarsan, gerçekte sistemi tıkayan yüz milisaniyelik tekrarlı sorguları hiç görmezsin. Teşhis dönemi için eşiği 200 milisaniyeye indir, indeks kullanmayan sorguları da ayrıca kaydet ve günlüğü yalnızca gerçek trafiğin olduğu bir saat boyunca aç. Sonra kapat; sürekli açık kalan ayrıntılı günlük kendi başına yük üretir.

Günlüğü elle okumak yerine özetle. Sorguları normalleştirip toplam süreye göre sıralayan bir araç, sana ilk beş suçluyu on saniyede verir. Burada aradığın liste kısa olur: genellikle bir sipariş listeleme sorgusu, bir stok sayımı, bir kullanıcı bakiye toplamı ve bir rapor ekranı. Bu dördünü düzeltmek, çoğu epin yazılım kurulumunda algılanan yavaşlığın büyük bölümünü bitirir.

BelirtiOlası nedenTeşhis yoluKalıcı çözüm
Tüm site eşit oranda yavaşPaylaşımlı kaynak/disk darlığıSunucu yük ve disk gecikmesi ölçümüKaynak veya barındırma değişimi
Sadece sipariş ve rapor sayfaları yavaşİndekssiz filtre ve sıralamaEXPLAIN + satır tarama sayısıBileşik indeks, tarih aralığı zorunluluğu
Sayfa yükü trafikle doğrusal artıyorN+1 sorgu döngüsüİstek başına sorgu sayımıToplu sorgu, ilişki ön yükleme
Yoğun anda kısa süreli tam donmaSatır veya tablo kilidiAktif işlem ve kilit bekleme listesiİşlem kapsamını küçültmek
Gece belirli saatte yavaşlamaYedek veya toplu iş çakışmasıZamanlanmış görev takvimiBakım penceresini kaydırmak
Yazma işlemleri yavaş, okuma hızlıFazla ve kullanılmayan indeksİndeks kullanım istatistikleriÖlü indeksleri kaldırmak

EXPLAIN çıktısında hangi üç satırı okursun?

EXPLAIN korkutucu görünür ama pratikte sadece üç şeye bakman yeter. Birincisi erişim tipi: burada "ALL" görüyorsan sorgu tabloyu baştan sona tarıyor demektir, bu neredeyse her zaman düzeltilebilir bir hatadır. İkincisi tahmini satır sayısı: sonuçta 20 satır dönerken tahmin 400.000 ise yanlış indeksle çalışıyorsun. Üçüncüsü ek açıklama alanı: "Using temporary" ve "Using filesort" ifadeleri, sıralama işinin bellekte geçici tablo kurarak yapıldığını, yani indeksin sıralamayı karşılamadığını söyler.

Düzeltme genelde indeksin sırasını değiştirmekle olur. Filtre sütunları önce, sıralama sütunu sonra gelir. Örneğin siparişleri duruma göre filtreleyip tarihe göre sıralıyorsan, indeksi bu iki sütunu bu sırayla kapsayacak biçimde kurarsın. Tek sütunlu iki ayrı indeks aynı işi yapmaz; veritabanı ikisinden yalnızca birini seçer ve diğer işi elle yapar. Bu ayrım, bir e-pin scripti yönetim panelinde sayfa açılışını saniyelerden milisaniyelere indiren en ucuz müdahaledir.

Teşhis edilen yavaş sorguların kök neden dağılımı

  • Eksik veya yanlış sıralı indeks 40%
  • N+1 tekrarlı sorgu 25%
  • Kilit ve uzun işlem 20%
  • Şema ve arşiv borcu 15%

Kilitler: satır kilidi ve sipariş anındaki sessiz kuyruk

Sorgular tek tek hızlı olduğu hâlde site yoğun anda donuyorsa, suçlu neredeyse kesin olarak kilitlerdir. Kilit sorununun imzası nettir: ortalama süre normal, ama bazı isteklerin süresi tam olarak zaman aşımı değerine eşit çıkar. Sebep genellikle işlem kapsamının gereğinden geniş tutulmasıdır. Stok düşümüyle başlayan bir işlemin içine e-posta gönderimi, dış API çağrısı veya log yazımı koyarsan, o satır dış servisin yanıt süresi kadar kilitli kalır.

Kural basittir: işlemin içine yalnızca veritabanı işi girer. Dış dünyaya dokunan her şey işlem bittikten sonra, tercihen kuyruk üzerinden yapılır. İkinci kural, satırlara her zaman aynı sırayla dokunmaktır; farklı sırayla kilitleyen iki akış karşılıklı bekleme üretir ve ölümcül kilit oluşur. Üçüncü kural, uzun raporları canlı tablodan değil okuma kopyasından veya önceden hesaplanmış özet tablosundan çalıştırmaktır.

Tek satırlık en verimli teşhis

Yavaşlık anında aktif işlem listesini al ve en uzun süredir çalışan sorguyu not et. Çoğu vakada suçlu ilk üç satırdadır. Bu bakışı almadan indeks eklemek, karanlıkta ateş etmektir.

İndeks eklemek ne zaman zarar verir?

İndeks bedava değildir. Her indeks, her ekleme ve güncellemede ayrıca yazılır. E-pin satışında yazma yoğunluğu yüksektir: her sipariş stok hareketi, bakiye kaydı ve log satırı üretir. Bu tablolara ihtiyatsızca beş altı indeks eklersen okuma hızlanır ama sipariş kaydı yavaşlar. Kampanya anında yazma yavaşlığı, okuma yavaşlığından çok daha pahalıdır.

Doğru yaklaşım, indeksleri de ölçümle yönetmektir. Veritabanının indeks kullanım istatistiklerine bak; aylardır hiç kullanılmayan indeksleri sil. Aynı sütun setini kapsayan iç içe indeksleri teke indir. Çok geniş metin sütunlarını indekslemek yerine arama için ayrı bir alan kullan. Bir e-pin satış yazılımı değerlendirirken şema tarafında bu disiplinin uygulanıp uygulanmadığını sorman, uzun vadeli performansı doğrudan belirler; özellik listesinde veri katmanının nasıl kurulduğuna bakmak iyi bir başlangıç olur.

Şema borcu: log tabloları, arşivleme ve bakım penceresi

Teşhis ettiğin yavaşlığın bir kısmı aslında birikmiş şema borcudur. API çağrı logları, oturum kayıtları, başarısız ödeme denemeleri ve bildirim kuyruğu artıkları hiç temizlenmediğinde bu tablolar ana tablolardan daha büyük hâle gelir. Yedekleme süresi uzar, disk dolar, tablo bakımı imkânsızlaşır. Çözüm karmaşık değil: her log tablosuna bir saklama süresi tanımla ve eski kayıtları aylık parçalar hâlinde arşive taşı.

Arşivlemeyi tek seferde dev bir silme komutuyla yapmak yeni bir kesinti üretir; kayıtları küçük gruplar hâlinde, düşük trafik saatinde ve aralarda soluklanarak taşı. Ayrıca düzenli bir bakım penceresi tanımla: indeks istatistiklerinin yenilenmesi, tablo yeniden düzenlemesi ve yedek geri yükleme denemesi bu pencereye girer. Yedeğini hiç geri yüklemediysen, yedeğin olduğunu değil, olduğunu umduğunu bilirsin.

Kontrol adımıNeyi ortaya çıkarırSıklık
Yavaş sorgu günlüğü özetiToplam süreyi en çok yiyen ilk beş sorguAyda bir
İstek başına sorgu sayısıGizli N+1 döngüleriHer sürüm sonrası
EXPLAIN taramasıTam tablo taraması ve filesortYeni ekran eklendiğinde
Aktif kilit ve işlem listesiUzun işlem ve kilit kuyruğuYoğun anlarda
İndeks kullanım istatistiğiÖlü indeks ve yazma yüküÜç ayda bir
Tablo boyutu ve büyüme hızıArşivleme gereken log tablolarıAyda bir
Yedekten geri yükleme denemesiKurtarma planının gerçekliğiÜç ayda bir

Yavaşlığı her ay yeniden aramaktan kurtul

Ölçüm, indeks disiplini ve arşivleme kuralları kurulu gelen bir altyapıyla çalış; teşhisi sen değil panel yapsın.

Sunucumu büyütsem yavaşlık geçer mi?

Genellikle sadece erteler. İndeks kullanmayan bir sorgu daha hızlı donanımda da tüm tabloyu tarar; tablo büyüdükçe aynı yavaşlık geri gelir. Önce sorguyu düzeltmek, sonra kaynağa bakmak doğru sıradır.

Slow query log'u sürekli açık tutabilir miyim?

Düşük eşikle sürekli açık tutmak disk ve yazma yükü üretir. Teşhis dönemlerinde bir iki saat açıp kapatmak, sonra yalnızca yüksek eşikle bırakmak daha sağlıklıdır.

Kaç indeks fazla sayılır?

Kesin bir sayı yok; ölçüt kullanımdır. Yazma yoğun tablolarda kullanılmayan her indeks doğrudan zarardır. İstatistiklere göre ölü indeksleri kaldırmak, yenisini eklemek kadar önemlidir.

Log tablolarını silmek yerine ne yapmalıyım?

Saklama süresi tanımlayıp eski kayıtları arşiv tablosuna ya da dosya arşivine küçük gruplar hâlinde taşımak en güvenli yol. Böylece denetim izini kaybetmeden canlı tabloları küçük tutarsın.

Veritabanı performansı bir kerelik iş değil, küçük ve düzenli bir alışkanlıktır: ölç, en pahalı beş sorguyu düzelt, indeksi ve arşivi temiz tut. Bu alışkanlığın panelin içine gömülü geldiği bir kurulumu görmek istersen canlı demo üzerinden sipariş ve rapor ekranlarını gerçek veriyle dene, ardından fiyat bölümünden sana uygun paketi seç.

Daha Fazlasını Keşfedin

Dijital ürün satışı ve otomasyon üzerine güncel rehberlere göz atın.

Tüm Yazıları Gör →
Bu yazıyı paylaşın
Bu yazıyı beğendiniz mi?
Teşekkürler!
← Tüm yazılar