Cardinality ใน MySQL คืออะไร? กรุณาอธิบายด้วยภาษาที่เรียบง่ายและไม่ใช้เทคนิค
หากรายละเอียดดัชนีของตารางใด ๆ แสดงจำนวนสมาชิกของเขตข้อมูลบอกว่าgroup_id
เป็น 11 หมายความว่าอย่างไร
Cardinality ใน MySQL คืออะไร? กรุณาอธิบายด้วยภาษาที่เรียบง่ายและไม่ใช้เทคนิค
หากรายละเอียดดัชนีของตารางใด ๆ แสดงจำนวนสมาชิกของเขตข้อมูลบอกว่าgroup_id
เป็น 11 หมายความว่าอย่างไร
คำตอบ:
Max cardinality: ค่าทั้งหมดไม่ซ้ำกัน
คาร์ดินาลิตี้ขั้นต่ำ: ค่าทั้งหมดเหมือนกัน
บางคอลัมน์เรียกว่าคอลัมน์ high-cardinality เนื่องจากมีข้อ จำกัด (เช่นไม่ซ้ำกัน) ห้ามไม่ให้คุณใส่ค่าเดียวกันในทุกแถว
Cardinality เป็นคุณสมบัติที่มีผลต่อความสามารถในการทำคลัสเตอร์เรียงลำดับและค้นหาข้อมูล ดังนั้นจึงเป็นการวัดผลที่สำคัญสำหรับผู้วางแผนการสืบค้นในฐานข้อมูลเป็นการศึกษาแบบฮิวริสติกซึ่งพวกเขาสามารถใช้เพื่อเลือกแผนการที่ดีที่สุดได้
Wikipedia สรุปcardinality ใน SQLดังนี้:
ในSQL (Structured Query Language) ระยะcardinalityหมายถึงเอกลักษณ์ของค่าข้อมูลที่มีอยู่ในคอลัมน์ใดคอลัมน์หนึ่ง (แอตทริบิวต์) ของฐานข้อมูล ตาราง ยิ่งคาร์ดินาลลิตี้ต่ำองค์ประกอบที่ซ้ำกันในคอลัมน์ก็จะยิ่งมากขึ้น ดังนั้นคอลัมน์ที่มีจำนวนสมาชิกน้อยที่สุดจะมีค่าเท่ากันสำหรับทุกแถว ฐานข้อมูล SQL ใช้จำนวนสมาชิกเพื่อช่วยในการกำหนดแผนการสืบค้นที่เหมาะสมที่สุดสำหรับแบบสอบถามที่กำหนด
เป็นการประมาณจำนวนค่าที่ไม่ซ้ำกันในดัชนี
สำหรับตารางที่มีคอลัมน์คีย์หลักเพียงคอลัมน์เดียวโดยปกติจำนวนสมาชิกควรเท่ากับจำนวนแถวในตาราง
โดยพื้นฐานแล้วจะเกี่ยวข้องกับระดับความเป็นเอกลักษณ์ของค่าคอลัมน์ตามบทความ Wikipedia ที่เชื่อมโยงโดย Kami
เหตุใดจึงสำคัญที่ต้องพิจารณาคือมีผลต่อกลยุทธ์การจัดทำดัชนี จะมีจุดเล็ก ๆ น้อย ๆ ที่จัดทำดัชนีคอลัมน์คาร์ดินาลลิตี้ต่ำโดยมีค่าที่เป็นไปได้เพียง 2 ค่าเนื่องจากดัชนีจะไม่ถูกเลือกเพียงพอที่จะใช้
จำนวนสมาชิกที่สูงขึ้นความแตกต่างของแถวที่ดีกว่าคือ การสร้างความแตกต่างช่วยในการนำทางสาขาน้อยลงเพื่อรับข้อมูล
ดังนั้นค่า Cordinality ที่สูงขึ้นหมายถึง:
ในทางคณิตศาสตร์คาร์ดินาลลิตี้คือการนับค่าในชุดของค่า ชุดสามารถมีได้เฉพาะค่าที่ไม่ซ้ำกัน ตัวอย่างเช่นชุด "A"
ให้เซต "A" เป็น: A = {1,2,3} - จำนวนสมาชิกของเซตนั้นคือ | 3 |.
หากตั้งค่า "A" มี 5 ค่า A = {10,21,33,42,57} จำนวนสมาชิกคือ | 5 |
สิ่งที่หมายถึงในบริบทของ mysql คือจำนวนสมาชิกของคอลัมน์ตารางคือการนับค่าเฉพาะของคอลัมน์นั้น หากคุณกำลังดูจำนวนคาร์ดินาลลิตี้ของคอลัมน์คีย์หลักของคุณ (เช่น table.id) คาร์ดินาลิตี้ของคอลัมน์นั้นจะบอกจำนวนแถวในตารางเนื่องจากมี ID ที่ไม่ซ้ำกันหนึ่งรายการสำหรับแต่ละแถวในตาราง คุณไม่จำเป็นต้องดำเนินการ "COUNT (*)" บนตารางเพื่อดูว่ามีกี่แถวเพียงแค่ดูที่จำนวนสมาชิก
กล่าวง่ายๆว่าคาร์ดินาลลิตี้คือจำนวนแถวหรือสิ่งที่เพิ่มขึ้นภายในตาราง จำนวนคอลัมน์เรียกว่า "องศา"
จากคู่มือ :
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)