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_id
sebagai 11, lalu apa artinya itu?
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_id
sebagai 11, lalu apa artinya itu?
Jawaban:
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.
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.
Ini adalah perkiraan jumlah nilai unik dalam indeks.
Untuk tabel dengan kolom kunci primer tunggal, kardinalitas biasanya harus sama dengan jumlah baris dalam tabel.
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.
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:
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.
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)