
Veritabanı Dizinleri: Yavaş Sorguyu Hızlandırmanın En Ucuz Yolu
Siteniz açılırken sunucu kaynak uyarısı veriyor ve barındırma sağlayıcınız sorgu yükünden söz ediyor. Paket yükseltmeden önce bakılacak ilk yer genellikle dizinlerdir — çünkü tek bir eksik dizin, saniyeler süren bir sorguyu milisaniyeye indirebilir.
Bu yazı, dizin mantığını ve doğru kullanımını ele alıyor.
Dizin Ne Yapar
Dizinsiz bir sorgu şöyle çalışır:
- Tablodaki ilk satır okunur.
- Koşula uyuyor mu bakılır.
- Son satıra kadar tekrarlanır.
Üçüncü adım maliyeti açıklar: dizin yoksa veritabanı aradığı kaydı bulmak için tablodaki her satırı okumak zorundadır — yüz bin satırlı bir tabloda tek bir kayıt için yüz bin okuma yapılır.
Dizin, kitabın arkasındaki dizine benzer; aranan değerin hangi satırda olduğunu doğrudan söyler.
Bu sayede okuma sayısı binlerceden birkaç taneye düşer.
Fark, tablo büyüdükçe katlanarak artar.
Hangi Sütunlar Dizinlenmeli
| Kullanım | Dizin gerekli mi |
|---|---|
| Koşulda filtrelenen sütun | Evet |
| Tablo birleştirme sütunu | Kesinlikle |
| Sıralama sütunu | Genellikle |
| Yalnızca gösterilen sütun | Hayır |
İkinci satır en yüksek getiriyi sağlar: iki tabloyu birleştiren sütunda dizin yoksa, veritabanı birinci tablodaki her satır için ikinci tablonun tamamını taramak zorunda kalır ve maliyet çarpım olarak büyür.
Bu, en sık karşılaşılan yavaş sorgu nedenidir.
Dördüncü satır ise yaygın bir israfı önler; yalnızca ekranda gösterilen sütunlar dizinlenmemelidir.
Her gereksiz dizin, yazma işlemlerini yavaşlatır ve disk tüketir.
Bileşik Dizin Sırası
- Birden fazla sütun tek dizinde olabilir.
- Sütun sırası belirleyicidir.
- Soldan başlayarak kullanılır.
Üçüncü madde çoğu kişinin gözden kaçırdığı kuraldır: bileşik bir dizin yalnızca soldaki sütunlardan başlayarak kullanılabilir — durum ve tarih sırasıyla oluşturulmuş bir dizin, tek başına tarihe göre yapılan bir aramada işe yaramaz.
Bu nedenle sıralama, en sık kullanılan filtreye göre belirlenmelidir.
Seçiciliği yüksek sütunu öne almak genellikle doğrudur.
Aynı sütunları farklı sırada içeren iki dizin oluşturmak nadiren gerekir ve maliyetlidir.
Dizinin Bedeli
- Okuma hızlanır.
- Yazma yavaşlar.
- Disk kullanımı artar.
İkinci madde dengeyi açıklar: her ekleme, güncelleme ve silme işleminde tüm dizinlerin de güncellenmesi gerekir — on dizinli bir tabloya kayıt eklemek, iki dizinli bir tabloya eklemekten belirgin biçimde yavaştır.
Bu nedenle dizin sayısı kontrolsüz artmamalıdır.
Okuma ağırlıklı tablolarda daha fazla dizin makuldür.
Yazma ağırlıklı tablolarda ise yalnızca zorunlu dizinler tutulur.
Kullanılmayan Dizinler
| Durum | Yapılacak |
|---|---|
| Hiç kullanılmayan dizin | Kaldırılmalı |
| Başka dizinin ön eki olan | Gereksiz |
| Aynı sütunda iki dizin | Biri silinmeli |
İkinci satır sıkça gözden kaçar: durum sütunu için ayrı bir dizin varsa ve durum ile tarih içeren bileşik bir dizin de varsa, tek sütunlu olan gereksizdir — bileşik dizin onun işini zaten görür.
Bu tür yinelemeler, zamanla eklenen dizinlerde birikir.
Üçüncü satır ise genellikle farklı adlarla oluşturulmuş kopyalardan doğar.
Temizlik, yazma performansını doğrudan iyileştirir.
Dizini Devre Dışı Bırakan Yazımlar
- Sütun üzerinde işlem yapmak.
- Başında joker karakterle arama.
- Tür dönüşümü gerektiren karşılaştırma.
Birinci madde en sinsi olanıdır: bir sütunu koşul içinde fonksiyona sokarsanız dizin kullanılamaz hâle gelir — tarih sütununun yılını çıkarıp karşılaştırmak yerine tarih aralığı vermek, aynı sonucu dizinden yararlanarak üretir.
Bu değişiklik çoğu zaman tek satırlık bir düzeltmedir.
İkinci madde metin aramalarında geçerlidir; joker karakter başta olduğunda dizin işe yaramaz.
Üçüncü madde ise metin sütununu sayıyla karşılaştırmak gibi durumlarda ortaya çıkar ve sessizce tam tarama yaptırır.
Ölçmeden Değiştirmeyin
- Yavaş sorgu kaydını açın.
- Sorgu planını inceleyin.
- Dizin ekleyip tekrar ölçün.
İkinci madde işin özüdür: sorgu planı, veritabanının hangi dizini kullandığını ve kaç satır okuduğunu gösterir — tahmin etmek yerine bakmak, çoğu performans tartışmasını dakikalar içinde bitirir.
Planda tam tablo taraması görünüyorsa dizin adayı bulunmuştur.
Birinci madde ise hangi sorguların gerçekten sorun olduğunu belirler.
En çok çalışan sorgu, en yavaş sorgudan daha önemli olabilir.
Bakım ve İstatistikler
- Veritabanı istatistiklere göre karar verir.
- İstatistikler eskiyebilir.
- Tablo analizi tazeler.
İkinci madde beklenmedik yavaşlamaları açıklar: veritabanı hangi dizini kullanacağına tablo istatistiklerine bakarak karar verir — bu istatistikler güncel değilse doğru dizin varken bile yanlış plan seçilebilir.
Toplu veri yüklemesinden sonra bu durum sık görülür.
Tablo analizi komutu istatistikleri tazeler ve planı düzeltir.
Düzenli bakım, dizinlerin verimini korur.
Veritabanı yükünü doğru ölçebilmek ve sorgu planlarını inceleyebilmek için yeterli panel erişimi gerekir; hosting barındırma paketleri ile veritabanı yönetim araçlarına doğrudan ulaşabilirsiniz.
Sonuç
Yavaş sorguların çoğu donanım değil dizin sorunudur: dizin yoksa veritabanı aradığı kaydı bulmak için tablodaki her satırı okumak zorundadır. Önce birleştirme ve filtreleme sütunlarını dizinleyin, sonra kullanılmayanları temizleyin. Bileşik dizinlerde sıraya dikkat edin — bileşik bir dizin yalnızca soldaki sütunlardan başlayarak kullanılabilir — ve her değişikliği sorgu planına bakarak doğrulayın.
Sıkça Sorulan Sorular (SSS)
Dizin sorguyu neden hızlandırır?
Dizin yoksa veritabanı aradığı kaydı bulmak için tablodaki her satırı okur; yüz bin satırlı bir tabloda tek kayıt için yüz bin okuma yapılır. Dizin, aranan değerin hangi satırda olduğunu doğrudan söyler ve okuma sayısı birkaç taneye iner.
Tüm sütunları dizinlemeli miyim?
Hayır. Her dizin yazma işlemlerini yavaşlatır ve disk tüketir; her ekleme ve güncellemede tüm dizinlerin de güncellenmesi gerekir. Yalnızca filtrelenen, birleştirilen ve sıralanan sütunları dizinleyin; sadece gösterilen sütunları değil.
Bileşik dizinde sütun sırası önemli mi?
Çok önemli. Bileşik dizin yalnızca soldaki sütunlardan başlayarak kullanılabilir. Durum ve tarih sırasıyla oluşturulmuş bir dizin, tek başına tarihe göre yapılan aramada işe yaramaz. Sırayı en sık kullanılan filtreye göre belirleyin.
Dizin var ama sorgu hâlâ yavaş?
Sorgunun yazımı dizini devre dışı bırakıyor olabilir. Sütunu koşul içinde bir fonksiyona sokmak, başında joker karakterle arama yapmak veya tür dönüşümü gerektiren karşılaştırma dizini kullanılamaz hâle getirir. Sorgu planına bakarak doğrulayın.