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:
Cardinality | Anlamı | İndeks Seçimi Açısından | Performansa Etki |
---|---|---|---|
Yüksek | Çok fazla benzersiz değer | İdeal, tercih edilir | ✅ İyi |
Düşük | Az sayıda farklı değer | Zayı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
- Sorgu Planı Seçimi:
- Veritabanı motoru, yüksek cardinality indeksleri daha seçici bulur ve onları tercih eder.
- WHERE Şartlarında Filtreleme Etkisi:
- Örneğin
WHERE email = ?
gibi sorgularda, yüksek cardinality indeksi sayesinde daha az satır taranır.
- Örneğin
- 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.
Kolon | Cardinality | GROUP BY Performansı |
---|---|---|
email | Yüksek | ✅ Çok iyi |
gender | Düşü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:
- MySQL Resmi Belgeleri: https://dev.mysql.com/doc/refman/8.0/en/show-index.html
- Percona Blog: Understanding MySQL Index Cardinality
- EXPLAIN and Optimizer Documentation