Cardinality ใน MySQL คืออะไร?


106

Cardinality ใน MySQL คืออะไร? กรุณาอธิบายด้วยภาษาที่เรียบง่ายและไม่ใช้เทคนิค

หากรายละเอียดดัชนีของตารางใด ๆ แสดงจำนวนสมาชิกของเขตข้อมูลบอกว่าgroup_idเป็น 11 หมายความว่าอย่างไร

คำตอบ:


120

Max cardinality: ค่าทั้งหมดไม่ซ้ำกัน

คาร์ดินาลิตี้ขั้นต่ำ: ค่าทั้งหมดเหมือนกัน

บางคอลัมน์เรียกว่าคอลัมน์ high-cardinality เนื่องจากมีข้อ จำกัด (เช่นไม่ซ้ำกัน) ห้ามไม่ให้คุณใส่ค่าเดียวกันในทุกแถว

Cardinality เป็นคุณสมบัติที่มีผลต่อความสามารถในการทำคลัสเตอร์เรียงลำดับและค้นหาข้อมูล ดังนั้นจึงเป็นการวัดผลที่สำคัญสำหรับผู้วางแผนการสืบค้นในฐานข้อมูลเป็นการศึกษาแบบฮิวริสติกซึ่งพวกเขาสามารถใช้เพื่อเลือกแผนการที่ดีที่สุดได้


10
เครื่องรางนี้มีอะไรสำหรับคำใหญ่ "ความโดดเด่น" ก็ใช้ได้ดีไม่ใช่เหรอ?
Pacerier

8
@Pacerier: ใช่แม้ว่าฉันคิดว่าคนที่ทำงานเกี่ยวกับฐานข้อมูลจะคุ้นเคยกับทฤษฎีเชิงสัมพันธ์ทฤษฎีเซตและคณิตศาสตร์อยู่แล้ว และพวกเขายืมคำศัพท์จาก set theory: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling

27
@Pacerier ความแตกต่างคือคำที่ใหญ่กว่า (โดย 1)
Drew

4
@Drew,;) ไม่ใช่ถ้าเปรียบเทียบคำศัพท์
Pacerier

8
@Pacerier Lexeme? "ความโดดเด่น" ก็ใช้ได้เหมือนกันใช่ไหม ;) ถ้าเราทำงานหนักมากพอเราสามารถลดทั้งภาษาลงเหลือเพียง 1 คำและแสดงความเป็นตัวเองผ่านการทำซ้ำและหยุดชั่วคราว
Jason

34

Wikipedia สรุปcardinality ใน SQLดังนี้:

ในSQL (Structured Query Language) ระยะcardinalityหมายถึงเอกลักษณ์ของค่าข้อมูลที่มีอยู่ในคอลัมน์ใดคอลัมน์หนึ่ง (แอตทริบิวต์) ของฐานข้อมูล ตาราง ยิ่งคาร์ดินาลลิตี้ต่ำองค์ประกอบที่ซ้ำกันในคอลัมน์ก็จะยิ่งมากขึ้น ดังนั้นคอลัมน์ที่มีจำนวนสมาชิกน้อยที่สุดจะมีค่าเท่ากันสำหรับทุกแถว ฐานข้อมูล SQL ใช้จำนวนสมาชิกเพื่อช่วยในการกำหนดแผนการสืบค้นที่เหมาะสมที่สุดสำหรับแบบสอบถามที่กำหนด


25

เป็นการประมาณจำนวนค่าที่ไม่ซ้ำกันในดัชนี

สำหรับตารางที่มีคอลัมน์คีย์หลักเพียงคอลัมน์เดียวโดยปกติจำนวนสมาชิกควรเท่ากับจำนวนแถวในตาราง

ข้อมูลเพิ่มเติม .


15

โดยพื้นฐานแล้วจะเกี่ยวข้องกับระดับความเป็นเอกลักษณ์ของค่าคอลัมน์ตามบทความ Wikipedia ที่เชื่อมโยงโดย Kami

เหตุใดจึงสำคัญที่ต้องพิจารณาคือมีผลต่อกลยุทธ์การจัดทำดัชนี จะมีจุดเล็ก ๆ น้อย ๆ ที่จัดทำดัชนีคอลัมน์คาร์ดินาลลิตี้ต่ำโดยมีค่าที่เป็นไปได้เพียง 2 ค่าเนื่องจากดัชนีจะไม่ถูกเลือกเพียงพอที่จะใช้


4
ย่อหน้าที่สองมีความสำคัญหากคุณพยายามทำความเข้าใจว่าควรจัดทำดัชนีคอลัมน์เมื่อใด
VMC

10

จำนวนสมาชิกที่สูงขึ้นความแตกต่างของแถวที่ดีกว่าคือ การสร้างความแตกต่างช่วยในการนำทางสาขาน้อยลงเพื่อรับข้อมูล

ดังนั้นค่า Cordinality ที่สูงขึ้นหมายถึง:

  • ประสิทธิภาพการอ่านแบบสอบถามที่ดีขึ้น
  • ขนาดฐานข้อมูลที่ใหญ่ขึ้น
  • ประสิทธิภาพการเขียนแบบสอบถามแย่ลงเนื่องจากกำลังอัปเดตข้อมูลดัชนีที่ซ่อนอยู่

7

ในทางคณิตศาสตร์คาร์ดินาลลิตี้คือการนับค่าในชุดของค่า ชุดสามารถมีได้เฉพาะค่าที่ไม่ซ้ำกัน ตัวอย่างเช่นชุด "A"

ให้เซต "A" เป็น: A = {1,2,3} - จำนวนสมาชิกของเซตนั้นคือ | 3 |.

หากตั้งค่า "A" มี 5 ค่า A = {10,21,33,42,57} จำนวนสมาชิกคือ | 5 |

สิ่งที่หมายถึงในบริบทของ mysql คือจำนวนสมาชิกของคอลัมน์ตารางคือการนับค่าเฉพาะของคอลัมน์นั้น หากคุณกำลังดูจำนวนคาร์ดินาลลิตี้ของคอลัมน์คีย์หลักของคุณ (เช่น table.id) คาร์ดินาลิตี้ของคอลัมน์นั้นจะบอกจำนวนแถวในตารางเนื่องจากมี ID ที่ไม่ซ้ำกันหนึ่งรายการสำหรับแต่ละแถวในตาราง คุณไม่จำเป็นต้องดำเนินการ "COUNT (*)" บนตารางเพื่อดูว่ามีกี่แถวเพียงแค่ดูที่จำนวนสมาชิก


4

กล่าวง่ายๆว่าคาร์ดินาลลิตี้คือจำนวนแถวหรือสิ่งที่เพิ่มขึ้นภายในตาราง จำนวนคอลัมน์เรียกว่า "องศา"


4

จากคู่มือ :

Cardinality

ค่าประมาณของจำนวนค่าที่ไม่ซ้ำกันในดัชนี สิ่งนี้อัปเดตโดยการเรียกใช้ ANALYZE TABLE หรือ myisamchk -a Cardinality จะนับตามสถิติที่จัดเก็บเป็นจำนวนเต็มดังนั้นค่าจึงไม่จำเป็นต้องแน่นอนแม้ในตารางขนาดเล็ก ยิ่งมี cardinality สูงโอกาสที่ MySQL จะใช้ดัชนีเมื่อทำการรวมก็จะยิ่งมากขึ้น

และการวิเคราะห์จาก 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)

1
คำตอบนี้ไม่มีเนื้อหาที่คุณเขียนขึ้นเองเป็นเพียงภาพต่อกันจากคู่มือ MySQL และบล็อกโพสต์ที่คุณเชื่อมโยง และมีรูปแบบที่น่ากลัวที่ด้านบนของสิ่งนั้น
Siguza

1
ตอนนี้มันบอกแหล่งที่มาอย่างชัดเจนและมีรูปแบบที่ดีขึ้น
carla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.