Close

2025-05-23

Veritabanı Performansının Sessiz Kahramanı: MySQL Cardinality Nedir ve Neden Önemlidir?

Veritabanı Performansının Sessiz Kahramanı: MySQL Cardinality Nedir ve Neden Önemlidir?

MySQL sorgularınız yavaş mı çalışıyor? Sorgularınızda indeks kullanmanıza rağmen hala verimsizlik mi var? Cevap, belki de “Cardinality” adı verilen ama sıkça göz ardı edilen bir metriktedir. MySQL’de indeks performansını anlamak için kullanılan bu değer, doğru kullanıldığında sorgularınızı uçuşa geçirebilir.

Cardinality Nedir?

MySQL’de Cardinality, bir indeks içinde yer alan benzersiz (unique) değerlerin tahmini sayısını gösterir. Bu değer, indeksin ne kadar seçici olduğunu gösterir ve veritabanı motoru (optimizer) tarafından sorgu planını oluştururken kullanılır.

Örnek:

Bir customers tablonuzda country_id adında bir kolon olsun. Bu kolonda 10.000 satır ve sadece 5 farklı ülke varsa:

  • Cardinality ≈ 5 olur (düşük seçicilik)

Aynı sayıda satırda email kolonu benzersizse:

  • Cardinality ≈ 10.000 olur (yüksek seçicilik)

Cardinality Değerleri Nerede Görülür?

SHOW INDEXES FROM tablo_adi;

Çıktıdaki Cardinality sütunu, her indeks için tahmini benzersiz değer sayısını gösterir.

İstersen daha detaylı analiz için şu sorguyu kullanabilirsin:

SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name = 'tablo_adi';

Cardinality Neye Göre Hesaplanır?

  • MySQL bu değeri istatistiksel örnekleme yoluyla tahmin eder.
  • Kesin değil, yaklaşık değerdir.
  • Güncel değilse yanlış kararlar alabilir.

Güncellemek için:

ANALYZE TABLE tablo_adi;

Cardinality Neden Önemlidir?

Veritabanı motoru, cardinality değerine göre hangi indeksin kullanılacağına karar verir. Bu nedenle:

CardinalityAnlamıİndeks Seçimi AçısındanPerformansa Etki
YüksekÇok fazla benzersiz değerİdeal, tercih edilir✅ İyi
DüşükAz sayıda farklı değerZayıf tercih⚠️ Genelde kötü

Örneğin gender kolonu (Erkek/Kadın) gibi iki değerli bir kolonun cardinality’si düşüktür. Bu tür indeksler genellikle sorgu optimizasyonuna katkı sağlamaz.

Cardinality’nin İndeks Performansına Etkisi

  1. Sorgu Planı Seçimi:
    • Veritabanı motoru, yüksek cardinality indeksleri daha seçici bulur ve onları tercih eder.
  2. WHERE Şartlarında Filtreleme Etkisi:
    • Örneğin WHERE email = ? gibi sorgularda, yüksek cardinality indeksi sayesinde daha az satır taranır.
  3. JOIN ve ORDER BY Performansı:
    • Yüksek cardinality indeksler, büyük tablolar arasında yapılan JOIN işlemlerini ciddi şekilde hızlandırabilir.

Cardinality ve Aggregate (Toplulaştırma) Sorguları

Cardinality sadece WHERE şartlarını değil, GROUP BY, COUNT(DISTINCT …), SUM() gibi aggregate fonksiyonları da doğrudan etkiler.

1. GROUP BY ile Etkileşimi:

  • GROUP BY kolonunuz yüksek cardinality’ye sahipse, daha fazla benzersiz grup oluşur ve MySQL bu gruplamayı daha verimli hale getirmek için indeksi kullanabilir.
KolonCardinalityGROUP BY Performansı
emailYüksek✅ Çok iyi
genderDüşük⚠️ Zayıf

2. COUNT(DISTINCT ...)

  • Cardinality değeri arttıkça, bu tür işlemler daha fazla kaynak tüketir.
  • Düşük cardinality ile bu sorgular daha hızlı çalışır.

3. EXPLAIN ile Takip Etme:

EXPLAIN SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id;
  • Eğer customer_id indeksli ve cardinality yüksekse, MySQL bu indeksi tercih eder ve sorgu hızlanır.

Cardinality Nasıl İyileştirilir?

  • ANALYZE TABLE komutunu periyodik olarak kullanarak istatistikleri güncel tutun.
  • Çok az farklı değeri olan kolonlara gereksiz indeksler eklemekten kaçının.
  • EXPLAIN ile sorguların planlarını takip edin.

Cardinality Göz Ardı Edilmemeli

Cardinality, sadece bir sayı değil; veritabanı performansının arka plandaki kritik bir karar vericidir. Özellikle büyük veri tabanlarında, doğru indeks yapısını kurmak ve cardinality’yi yönetmek, milisaniyelerle değil, saniyelerle ölçülen performans kazançları sağlayabilir.

İyi optimize edilmiş bir indeks, yalnızca doğru yerde değil, doğru cardinality değerine de sahip olandır.


Kaynakça:

Bir Cevap Yazın