Veritabanı İndeksleme: Başarısız Sorguları Hızlandırmada Yaptığım Hatalar

Bir kaç yıl önce, 2 milyon satırlı bir tablodan belirli kullanıcıların geçmiş işlemlerini çeken sorgu 45 saniye sürüyordu. Çözüm basitti: indeks ekle, bitti. Yanlış düşündüm.

İlk hata: WHERE koşulundaki her sütuna indeks koymak. Sorgu `WHERE user_id =? AND status =? AND created_at >?` olunca, üç ayrı indeks açtım. Veritabanı hangisini kullanacağını kafasında karıştırdı. Query planner tek bir bileşik indeks kullanmaya tercih ediyor: `(user_id, status, created_at)`. Sıra önemli. İlk sütun filtre, sonrası range. Bireysel indeksler çoğu zaman birbirinin yoluna giriyor.

İkinci hata: SELECT * ile indeks yazması. İndeks `user_id` ve `status` içeriyor ama sorgu 15 sütun istiyor. Veritabanı indeksten user_id buldu, sonra tüm satırı diskten okudu (bookmark lookup). İndekse `created_at` ekledim, yeterli olmadı. Çözüm: covering index. İhtiyaç duyduğum tüm sütunları indekse dahil ettim. Artık disk okumaya gerek kalmadı.

Üçüncü hata: İndeks oluşturduktan sonra query plan kontrol etmemek. Explain plan çalıştırmadığım için sorgu hala full table scan yapıyordu. İndeks var ama veritabanı onu kullanmıyordu çünkü sütun sırasını yanlış ayarlamıştım. EXPLAIN (ANALYZE, BUFFERS) komutu bunu 30 saniyede ortaya çıkardı.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Dördüncü hata: Yazma işlemlerini görmezden gelmek. İndeks ekledikçe INSERT ve UPDATE yavaşladı. Her yeni satırda indeks güncelleniyor. Başlangıçta 200 satır/saniye yazıyordum, indeks sonrası 50'ye düştü. Çözüm: sadece okunan sorgular için indeks. Yazma-yoğun tablolarda seçici olmak lazım.

Beşinci hata: Hiç kullanılmayan indeksleri silmemeyi unutmak. 6 ay sonra `sys.dm_db_index_usage_stats` sorgusu gösterdi ki 12 indeksten 8'i hiç kullanılmıyor. Disk alanı ve yazma overhead boşa gidiyor.

Bugün yapıyorum: İlk indeksi koymadan önce EXPLAIN plan okurum. Bileşik indeks tasarlarken sütun sırasını test ederim. Covering index kullanırım ama dikkatli. Her indeksi 3 ay sonra kontrol ederim, kullanılmıyorsa silerim.

İndeksleme sihir değil, terazi işi. Yanlış tasarım, hızlı sorguyu yavaş yapar.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz