MySQL'de kardinalite nedir?


106

MySQL'de kardinalite nedir? Lütfen basit, teknik olmayan bir dille açıklayın.

Herhangi bir tablonun dizin ayrıntısı bir alanın önemini group_id11 olarak gösteriyorsa, bu ne anlama geliyor?

Yanıtlar:


120

Maksimum kardinalite: Tüm değerler benzersizdir

Min kardinalite: Tüm değerler aynıdır

Bazı sütunlara yüksek kardinalite sütunları denir, çünkü her satıra aynı değeri koymanızı engelleyen (benzersiz gibi) yerinde kısıtlamaları vardır.

Kardinalite, verileri kümeleme, sıralama ve arama yeteneğini etkileyen bir özelliktir. Bu nedenle, DB'lerdeki sorgu planlayıcıları için önemli bir ölçümdür, en iyi planları seçmek için kullanabilecekleri bir buluşsal yöntemdir.


10
Büyük sözler için bu fetiş ne işe yarar? "Farklılık" iyi çalışır, değil mi?
Pacerier

8
@Pacerier: Evet, yine de veritabanları üzerinde çalışan insanların ilişkisel teori, set teorisi ve matematiğe zaten oldukça aşina olduğunu düşünüyorum. Ve bu terimi set teorisinden ödünç aldılar: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling

27
@Pacerier, Distinctness is a big word (by 1)
Drew

4
@Drew,;) lexemes karşılaştırılırsa değil.
Pacerier

8
@Pacerier Lexeme? "Farklılık" orada da işe yarar, değil mi? ;) Yeterince sıkı çalışırsak, tüm dili 1 kelimeye indirebilir ve farklı tekrarlar ve duraklamalarla kendimizi ifade edebiliriz.
Jason

34

Wikipedia, SQL'deki önemliliği şu şekilde özetler :

Gelen SQL (Structured Query Language) terimi önem düzeyi anlamına gelir benzersiz bir belirli bir kolon (özellik) içinde ihtiva edilen veri değerleri veritabanı tablo . Kardinalite ne kadar düşükse, bir sütundaki daha fazla yinelenen öğeler. Bu nedenle, olası en düşük önem düzeyine sahip bir sütun, her satır için aynı değere sahip olacaktır. SQL veritabanları , belirli bir sorgu için en uygun sorgu planını belirlemeye yardımcı olmak için önem düzeyini kullanır .


25

Dizindeki benzersiz değerlerin sayısının bir tahminidir.

Tek bir birincil anahtar sütunu olan bir tablo için, önem düzeyi normalde tablodaki satır sayısına eşit olmalıdır.

Daha fazla bilgi .


15

Temelde, Kami tarafından bağlantılı Wikipedia makalesine göre bir sütunun değerlerinin benzersizlik derecesi ile ilişkilidir.

Neden dikkate alınması önemli olduğu, indeksleme stratejisini etkilediğidir. İndeks kullanılacak kadar seçici olmayacağından, yalnızca 2 olası değere sahip düşük bir kardinalite sütununu indeksleyen çok az nokta olacaktır.


4
Bir sütunu indekslemenin ne zaman mantıklı olduğunu anlamaya çalışırsanız, ikinci paragraf önemlidir.
VMC

10

Kardinalite ne kadar yüksek olursa, satırların farklılaşması o kadar iyidir. Farklılaşma, veri elde etmek için daha az dalda gezinmeye yardımcı olur.

Bu nedenle daha yüksek kordinalite değerleri şu anlama gelir:

  • okuma sorgularının daha iyi performansı;
  • daha büyük veritabanı boyutu;
  • gizli dizin verileri güncellendiği için yazma sorgularının daha kötü performansı.

7

Matematiksel terimlerle, kardinalite, bir değerler kümesindeki değerlerin sayısıdır. Bir küme yalnızca benzersiz değerler içerebilir. Bir örnek "A" kümesi olabilir.

"A" kümesi şöyle olsun: A = {1,2,3} - bu kümenin önemi | 3 |.

"A" kümesi 5 değer A = {10,21,33,42,57} içeriyorsa, kardinalite | 5 | olur.

Mysql bağlamında bunun anlamı, bir tablo sütununun öneminin, o sütunun benzersiz değerlerinin sayısı olmasıdır. Birincil anahtar sütununuzun önemine (örn. Table.id) bakıyorsanız, o sütunun önemi, tablodaki her satır için bir benzersiz kimlik olduğundan, bu tablonun kaç satır içerdiğini size söyleyecektir. Bu masada kaç tane satır olduğunu bulmak için bir "COUNT (*)" işlemi yapmanız gerekmez, kardinaliteye bakın.


4

Basit bir şekilde, kardinalite, tablodaki satır veya tuple sayısıdır. Sütun sayısına "derece" denir


4

Gönderen manuel :

Kardinalite

Dizindeki benzersiz değerlerin sayısının bir tahmini. Bu, ANALYZE TABLE veya myisamchk -a çalıştırılarak güncellenir. Kardinalite, tamsayı olarak saklanan istatistiklere göre sayılır, bu nedenle değer küçük tablolar için bile kesin olmayabilir. Kardinalite ne kadar yüksek olursa, MySQL'in birleştirme yaparken indeksi kullanma şansı o kadar artar.

Ve Percona'dan bir analiz :

CREATE TABLE `antest` (
  `i` int(10) unsigned NOT NULL,
  `c` char(80) default NULL,
  KEY `i` (`i`),
  KEY `c` (`c`,`i`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

mysql> select count(distinct c) from antest;
+-------------------+
| count(distinct c) |
+-------------------+
|               101 |
+-------------------+
1 row in set (0.36 sec)


mysql> select count(distinct i) from antest;
+-------------------+
| count(distinct i) |
+-------------------+
|               101 |
+-------------------+
1 row in set (0.20 sec)

mysql> select count(distinct i,c) from antest;
+---------------------+
| count(distinct i,c) |
+---------------------+
|               10201 |
+---------------------+
1 row in set (0.43 sec)

mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest |          1 | i        |            1 | i           | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
| antest |          1 | c        |            1 | c           | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
| antest |          1 | c        |            2 | i           | A         |        NULL |     NULL | NULL   |      | BTREE      |         |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.00 sec)

mysql> analyze table sys_users;
+--------------------------------+---------+----------+----------+
| Table                          | Op      | Msg_type | Msg_text |
+--------------------------------+---------+----------+----------+
| antest                         | analyze | status   | OK       |
+--------------------------------+---------+----------+----------+
1 row in set (0.01 sec)


mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest |          1 | i        |            1 | i           | A         |         101 |     NULL | NULL   |      | BTREE      |         |
| antest |          1 | c        |            1 | c           | A         |         101 |     NULL | NULL   | YES  | BTREE      |         |
| antest |          1 | c        |            2 | i           | A         |       10240 |     NULL | NULL   |      | BTREE      |         |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.01 sec)

1
Bu cevap, kendi yazdığınız sıfır içerik içerir, sadece MySQL kılavuzundan ve bağlantı verdiğiniz blog gönderisinden bir kolajdır. Üstelik korkunç şekilde biçimlendirilmiş.
Siguza

1
Şimdi kaynakları açıkça söylüyor ve daha iyi biçimlendirilmiş.
carla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.