Apa kardinalitas di MySQL?

106

Apa kardinalitas di MySQL? Tolong jelaskan dalam bahasa non-teknis yang sederhana.

Jika detail indeks dari tabel mana pun menampilkan kardinalitas bidang yang dikatakan group_idsebagai 11, lalu apa artinya itu?

OM Keabadian
sumber

Jawaban:

120

Kardinalitas maks: Semua nilai unik

Kardinalitas minimum: Semua nilai adalah sama

Beberapa kolom disebut kolom berkardinalitas tinggi karena memiliki batasan (seperti unik) yang melarang Anda memasukkan nilai yang sama di setiap baris.

Kardinalitas adalah properti yang mempengaruhi kemampuan untuk mengelompokkan, mengurutkan dan mencari data. Oleh karena itu, ini merupakan pengukuran penting untuk perencana kueri di DB, ini adalah heuristik yang dapat mereka gunakan untuk memilih rencana terbaik.

Alexander Torstling
sumber
10
Ada apa dengan jimat ini untuk kata-kata besar. "Perbedaan" akan bekerja dengan baik bukan?
Pacerier
8
@Pacerier: Ya, meskipun menurut saya orang yang mengerjakan database sudah cukup akrab dengan teori relasional, teori himpunan, dan matematika. Dan mereka meminjam istilah dari teori himpunan: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling
27
@Pacerier, Perbedaan adalah kata yang lebih besar (oleh 1)
Drew
4
@Drew,;) tidak jika membandingkan leksem.
Pacerier
8
@Perier Lexeme? "Perbedaan" juga akan berhasil di sana, bukan? ;) Jika kita bekerja cukup keras, kita dapat mengurangi keseluruhan bahasa menjadi hanya 1 kata dan mengekspresikan diri kita melalui pengulangan dan jeda yang bervariasi.
Jason
34

Wikipedia merangkum kardinalitas dalam SQL sebagai berikut:

Dalam SQL (Structured Query Language), istilah kardinalitas mengacu pada keunikan nilai data yang terdapat dalam kolom (atribut) tabel database tertentu . Semakin rendah kardinalitasnya, semakin banyak elemen yang diduplikasi dalam sebuah kolom. Jadi, kolom dengan kardinalitas serendah mungkin akan memiliki nilai yang sama untuk setiap baris. Database SQL menggunakan kardinalitas untuk membantu menentukan rencana kueri yang optimal untuk kueri tertentu.

Kami
sumber
25

Ini adalah perkiraan jumlah nilai unik dalam indeks.

Untuk tabel dengan kolom kunci primer tunggal, kardinalitas biasanya harus sama dengan jumlah baris dalam tabel.

Informasi lebih lanjut .

Rapsodi
sumber
15

Ini pada dasarnya terkait dengan tingkat keunikan nilai kolom sesuai artikel Wikipedia yang ditautkan oleh Kami.

Mengapa penting untuk dipertimbangkan adalah karena hal itu memengaruhi strategi pengindeksan. Akan ada gunanya mengindeks kolom berkardinalitas rendah dengan hanya 2 kemungkinan nilai karena indeks tidak akan cukup selektif untuk digunakan.

Martin Smith
sumber
4
Paragraf kedua penting jika Anda mencoba memahami kapan masuk akal untuk mengindeks kolom.
VMC
10

Semakin tinggi kardinalitas, semakin baik diferensiasi baris. Diferensiasi membantu menavigasi lebih sedikit cabang untuk mendapatkan data.

Oleh karena itu, nilai kordinalitas yang lebih tinggi berarti:

  • kinerja permintaan baca yang lebih baik;
  • ukuran database yang lebih besar;
  • kinerja kueri tulis yang lebih buruk, karena data indeks tersembunyi sedang diperbarui.
Zon
sumber
7

Dalam istilah matematika, kardinalitas adalah hitungan nilai dalam sekumpulan nilai. Satu set hanya dapat berisi nilai unik. Contohnya adalah himpunan "A".

Misalkan himpunan "A" menjadi: A = {1,2,3} - kardinalitas dari himpunan itu adalah | 3 |.

Jika set "A" berisi 5 nilai A = {10,21,33,42,57}, maka kardinalitasnya adalah | 5 |.

Artinya dalam konteks mysql adalah bahwa kardinalitas kolom tabel adalah jumlah nilai unik kolom itu. Jika Anda melihat kardinalitas kolom kunci utama Anda (mis. Table.id), maka kardinalitas kolom tersebut akan memberi tahu Anda berapa banyak baris yang ada dalam tabel itu, karena ada satu ID unik untuk setiap baris dalam tabel. Anda tidak perlu melakukan "JUMLAH (*)" pada tabel itu untuk mengetahui berapa banyak baris yang dimilikinya, cukup lihat kardinalitasnya.

pengguna3112246
sumber
4

Secara sederhana, kardinalitas adalah jumlah baris atau tupel di dalam tabel. Jumlah kolom disebut "derajat"

Aayush
sumber
4

Dari manual :

Kardinalitas

Perkiraan jumlah nilai unik dalam indeks. Ini diperbarui dengan menjalankan TABEL ANALISIS atau myisamchk -a. Kardinalitas dihitung berdasarkan statistik yang disimpan sebagai bilangan bulat, jadi nilainya belum tentu tepat bahkan untuk tabel kecil. Semakin tinggi kardinalitasnya, semakin besar kemungkinan MySQL menggunakan indeks tersebut saat melakukan penggabungan.

Dan analisis dari Percona :

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)
Junjie Li
sumber
1
Jawaban ini tidak mengandung konten yang Anda tulis sendiri, ini hanya kolase dari manual MySQL dan posting blog yang Anda tautkan. Dan diformat mengerikan di atasnya.
Siguza
1
Sekarang dengan jelas disebutkan sumbernya dan lebih baik diformat.
carla