← Tüm yazılar

Veritabanı indeksleme: Sorgularınızı nasıl hızlandırır?

Burncode Team 3 dk okuma

“Veritabanımız neden yavaş?” sorunlarının büyük bir kısmı tek bir eksiğe dayanır: bir indekse. Veritabanları hakkında anlayabileceğiniz en yüksek getirili konulardan biridir ve çoğu açıklamanın anlattığından çok daha basittir.

Kütüphane benzetmesi

Kart kataloğu ve hiçbir düzen sistemi olmayan bir kütüphane hayal edin: Her kitap, rafta nerede boş yer varsa oraya konmuş. Belirli bir kitabı bulmak, koridorları dolaşıp her kitaba tek tek bakmak demektir. İndeksi olmayan bir veritabanı tablosu da böyledir: Bir satırı bulmak için veritabanı, aradığını bulana kadar her satırı tek tek kontrol eder. Buna tam tablo taraması denir. Küçük bir tabloda sorun değildir; milyonlarca satırlık bir tabloda ise acı verecek kadar yavaştır.

İndeks, kart kataloğudur. “Bu sütunun şu değere eşit olduğu satırları tam olarak burada bulabilirsin” diyen, ayrı ve sıralı bir yapıdır; böylece veritabanı her şeyi kontrol etmek yerine doğrudan oraya atlayabilir.

Arka planda gerçekte nasıl çalışır?

Çoğu veritabanı indeksleri B-tree adlı bir veri yapısıyla uygular: değerleri sıralı tutan ve veritabanının her adımda kalan olasılıkları kabaca yarıya indirerek aramayı daraltmasını sağlayan dengeli bir ağaç. Basılı bir sözlükte bir kelimeyi bulmanıza benzer. Veritabanı bir milyon satırı tek tek kontrol etmek yerine bir düzine ağaç düğümüne bakıp doğrudan cevaba ulaşabilir.

Doğru indeksi eklemenin birkaç saniye süren bir sorguyu birkaç milisaniyeye indirebilmesinin sebebi budur: Veritabanını daha çok çalıştırmıyor, aynı cevaba çok daha kısa bir yol sunuyorsunuz.

Gerçekte neleri indekslemelisiniz?

  • WHERE koşullarında kullanılan sütunlar: Sık sık filtrelediğiniz her şey güçlü bir indeks adayıdır.
  • Yabancı anahtarlar: Başka bir tabloya referans veren sütunlar; join'ler büyük ölçüde bunlara dayanır.
  • ORDER BY ile kullanılan sütunlar: Verileri zaten doğru sırada tutan bir indeks, sıralama adımını tamamen atlayabilir.
  • JOIN koşullarındaki sütunlar: Büyük tabloları, join sütunlarında indeks olmadan birleştirmek yavaş sorguların en yaygın sebeplerinden biridir.

Başınıza gelene kadar kimsenin bahsetmediği ödünleşim

İndeksler bedava değildir. Her satır eklediğinizde, güncellediğinizde ya da sildiğinizde her indeksin de güncellenmesi gerekir; yani indeks ekledikçe yazma işlemleri yavaşlar. İndeksler gerçek disk alanı da kaplar ve ölçek büyüdükçe bu önem kazanır. Kaçınılması gereken hata soyut anlamda “yetersiz indeks” ya da “fazla indeks” değildir; neredeyse hiç sorgulanmayan sütunları indekslemektir. Bu, hiçbir zaman gerçekten elde etmeyeceğiniz bir fayda için her yazma işlemini yavaşlatır.

İyi bir pratik kural: Gerçek sorgularınızın filtrelediği, birleştirdiği ve sıraladığı sütunları indeksleyin (varsa yavaş sorgu logunuzu inceleyin) ve her şeyi “ne olur ne olmaz” diye indeksleme dürtüsüne direnin.

Gerçek bir canlı veritabanının tam olarak hangi indekslere ihtiyaç duyduğunu ve hangilerinin her yazma işleminde sessizce maliyet yarattığını tespit etmek, yaptığımız altyapı çalışmalarının olağan bir parçasıdır. Gerçek trafik altında hantallaşmaya başlayan bir sistem için bu, çoğu zaman yapılabilecek en etkili tek değişikliktir.