Cardinality trong MySQL là gì?


106

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_idlà 11, thì điều đó có nghĩa là gì?

Câu trả lời:


120

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.


10
Điều gì với sự tôn sùng này cho những từ lớn. "Tính khác biệt" sẽ hoạt động tốt phải không?
Pacerier

8
@Pacerier: Vâng, mặc dù tôi nghĩ rằng những người làm việc trên cơ sở dữ liệu đã khá quen thuộc với lý thuyết quan hệ, lý thuyết tập hợp và toán học. Và họ mượn thuật ngữ từ lý thuyết tập hợp: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling

27
@Pacerier, Sự khác biệt là một từ lớn hơn (bởi 1)
Drew

4
@Drew,;) không nếu so sánh lexemes.
Pacerier

8
@Pacerier Lexeme? "Tính khác biệt" cũng sẽ hoạt động ở đó, phải không? ;) Nếu chúng ta làm việc đủ chăm chỉ, chúng ta có thể giảm toàn bộ ngôn ngữ xuống chỉ còn 1 từ và thể hiện bản thân thông qua sự lặp lại và tạm dừng khác nhau.
Jason

34

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.


25

Đâ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.

Thêm thông tin .


15

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.


4
Đoạn thứ hai rất quan trọng nếu bạn cố gắng hiểu thời điểm hợp lý để lập chỉ mục một cột.
VMC

10

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à:

  • hiệu suất tốt hơn của các truy vấn đọc;
  • kích thước cơ sở dữ liệu lớn hơn;
  • hiệu suất truy vấn ghi kém hơn, vì dữ liệu chỉ mục ẩn đang được cập nhật.

7

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.


4

Nói một cách đơn giản, cardinality là số hàng hoặc bộ giá trị trong bảng. Số cột được gọi là "độ"


4

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)

1
Câu trả lời này không chứa nội dung mà bạn đã tự viết, nó chỉ là ảnh ghép từ hướng dẫn sử dụng MySQL và bài đăng trên blog mà bạn đã liên kết đến. Và được định dạng khủng khiếp trên đầu trang đó.
Siguza

1
Bây giờ nó cho biết rõ ràng các nguồn và nó được định dạng tốt hơn.
carla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.