Cardinality trong MySQL là gì? Vui lòng giải thích bằng ngôn ngữ đơn giản, phi kỹ thuật.
Nếu một chi tiết chỉ mục của bất kỳ bảng nào hiển thị số lượng của một trường group_id
là 11, thì điều đó có nghĩa là gì?
Cardinality trong MySQL là gì? Vui lòng giải thích bằng ngôn ngữ đơn giản, phi kỹ thuật.
Nếu một chi tiết chỉ mục của bất kỳ bảng nào hiển thị số lượng của một trường group_id
là 11, thì điều đó có nghĩa là gì?
Câu trả lời:
Số lượng tối đa: Tất cả các giá trị là duy nhất
Số lượng tối thiểu: Tất cả các giá trị đều giống nhau
Một số cột được gọi là cột có số lượng cao vì chúng có các ràng buộc tại chỗ (như duy nhất) cấm bạn đặt cùng một giá trị vào mỗi hàng.
Cardinality là một thuộc tính ảnh hưởng đến khả năng phân cụm, sắp xếp và tìm kiếm dữ liệu. Do đó, nó là một phép đo quan trọng đối với những người lập kế hoạch truy vấn trong DB, nó là một phép đo lường mà họ có thể sử dụng để chọn những kế hoạch tốt nhất.
Wikipedia tóm tắt cardinality trong SQL như sau:
Trong SQL (Ngôn ngữ truy vấn có cấu trúc), thuật ngữ cardinality đề cập đến tính duy nhất của các giá trị dữ liệu có trong một cột (thuộc tính) cụ thể của bảng cơ sở dữ liệu . Cardinality càng thấp, càng có nhiều phần tử trùng lặp trong một cột. Do đó, một cột có số lượng thấp nhất có thể sẽ có cùng giá trị cho mọi hàng. Cơ sở dữ liệu SQL sử dụng cardinality để giúp xác định kế hoạch truy vấn tối ưu cho một truy vấn nhất định.
Đây là ước tính số lượng giá trị duy nhất trong chỉ mục.
Đối với một bảng có một cột khóa chính duy nhất, thông thường số lượng hàng phải bằng số hàng trong bảng.
Về cơ bản, nó được liên kết với mức độ duy nhất của các giá trị của cột theo bài viết trên Wikipedia được liên kết bởi Kami.
Tại sao điều quan trọng cần xem xét là nó ảnh hưởng đến chiến lược lập chỉ mục. Sẽ có rất ít điểm lập chỉ mục cho một cột số lượng thấp chỉ có 2 giá trị có thể có vì chỉ mục sẽ không đủ chọn lọc để sử dụng.
Cardinality càng cao thì sự khác biệt của các hàng càng tốt. Sự khác biệt hóa giúp điều hướng ít nhánh hơn để lấy dữ liệu.
Do đó, giá trị tủy sống cao hơn có nghĩa là:
Theo thuật ngữ toán học, cardinality là số lượng các giá trị trong một tập giá trị. Một tập hợp chỉ có thể chứa các giá trị duy nhất. Một ví dụ sẽ là tập hợp "A".
Cho tập "A" là: A = {1,2,3} - tổng số của tập đó là | 3 |.
Nếu tập "A" chứa 5 giá trị A = {10,21,33,42,57}, thì bản số là | 5 |.
Điều đó có nghĩa là trong ngữ cảnh của mysql là bản số của một cột trong bảng là số lượng các giá trị duy nhất của cột đó. Nếu bạn đang xem xét bản số của cột khóa chính (ví dụ: table.id), thì bản số của cột đó sẽ cho bạn biết bảng đó chứa bao nhiêu hàng, vì có một ID duy nhất cho mỗi hàng trong bảng. Bạn không cần phải thực hiện "COUNT (*)" trên bảng đó để tìm xem nó có bao nhiêu hàng, chỉ cần nhìn vào số lượng.
Từ sách hướng dẫn :
Cardinality
Ước tính số lượng giá trị duy nhất trong chỉ mục. Điều này được cập nhật bằng cách chạy ANALYZE TABLE hoặc myisamchk -a. Cardinality được tính dựa trên thống kê được lưu trữ dưới dạng số nguyên, do đó, giá trị không nhất thiết phải chính xác ngay cả đối với các bảng nhỏ. Cardinality càng cao, cơ hội MySQL sử dụng chỉ mục khi thực hiện phép nối càng lớn.
Và một phân tích từ 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)