MySQL의 카디널리티는 무엇입니까?


106

MySQL의 카디널리티는 무엇입니까? 간단하고 기술적이지 않은 언어로 설명하십시오.

테이블의 인덱스 세부 정보에 필드의 카디널리티가 group_id11로 표시되는 경우 이는 무엇을 의미합니까?

답변:


120

최대 카디널리티 : 모든 값이 고유합니다.

최소 카디널리티 : 모든 값이 동일합니다.

일부 열은 모든 행에 동일한 값을 넣는 것을 금지하는 제약 조건 (예 : 고유)이 있기 때문에 높은 카디널리티 열이라고합니다.

카디널리티는 데이터를 클러스터링, 정렬 및 검색하는 기능에 영향을주는 속성입니다. 따라서 DB의 쿼리 플래너에게 중요한 측정이며 최상의 계획을 선택하는 데 사용할 수있는 휴리스틱입니다.


10
큰 말에 대한이 페티쉬는 무엇입니까? "분명함"이 잘 작동하지 않습니까?
Pacerier

8
@Pacerier : 예, 비록 데이터베이스 작업을하는 사람들이 이미 관계 이론, 집합 이론 및 수학에 상당히 익숙하다고 생각합니다. : 그리고 그들은 집합 이론의 용어를 빌려 en.m.wikipedia.org/wiki/Cardinality
알렉산더 Torstling

27
@Pacerier, Distinctness는 더 큰 단어입니다 (1 기준)
Drew

4
@Drew,;) lexemes를 비교하는 경우가 아닙니다.
Pacerier 2015 년

8
@Pacerier Lexeme? "분명함"도 거기에서 작동하지 않습니까? ;) 우리가 충분히 열심히 일한다면, 우리는 전체 언어를 단 한 단어로 줄이고 다양한 반복과 멈춤을 통해 자신을 표현할 수 있습니다.
Jason

34

Wikipedia는 SQL의 카디널리티 를 다음과 같이 요약 합니다.

에서는 SQL (구조적 질의어) 용어 카디널리티 받는 지칭 고유성 (A)의 특정 열 (속성)에 포함 된 데이터 값의 데이터베이스 테이블 . 카디널리티가 낮을수록 열에서 더 많은 요소가 중복됩니다. 따라서 가능한 가장 낮은 카디널리티를 가진 열은 모든 행에 대해 동일한 값을 갖습니다. SQL 데이터베이스는 카디널리티를 사용 하여 주어진 쿼리에 대한 최적의 쿼리 계획 을 결정합니다 .


25

인덱스의 고유 값 수에 대한 추정치입니다.

단일 기본 키 열이있는 테이블의 경우 카디널리티는 일반적으로 테이블의 행 수와 같아야합니다.

추가 정보 .


15

기본적으로 Kami가 링크 한 Wikipedia 기사에 따라 열 값의 고유성 정도와 관련이 있습니다.

고려하는 것이 중요한 이유는 인덱싱 전략에 영향을 미치기 때문입니다. 인덱스가 사용하기에 충분히 선택적이지 않기 때문에 가능한 값이 2 개 뿐인 낮은 카디널리티 열을 인덱싱하는 지점이 거의 없습니다.


4
두 번째 단락은 열을 인덱싱하는 것이 합리적 일 때 이해하려고 할 때 중요합니다.
VMC

10

카디널리티가 높을수록 행의 차별화가 더 좋습니다. 차별화는 데이터를 얻기 위해 더 적은 분기를 탐색하는 데 도움이됩니다.

따라서 더 높은 코디 널리 티 값은 다음을 의미합니다.

  • 읽기 쿼리 성능 향상
  • 더 큰 데이터베이스 크기;
  • 숨겨진 인덱스 데이터가 업데이트되고 있기 때문에 쓰기 쿼리 성능이 저하됩니다.

7

수학적 용어에서 카디널리티는 값 집합에있는 값의 개수입니다. 집합에는 고유 한 값만 포함될 수 있습니다. 예를 들어 "A"세트가 있습니다.

집합 "A"를 A = {1,2,3}로 설정합니다. 해당 집합의 카디널리티는 | 3 |입니다.

집합 "A"에 5 개의 값 A = {10,21,33,42,57}이 포함 된 경우 카디널리티는 | 5 |입니다.

이것이 mysql의 맥락에서 의미하는 바는 테이블 열의 카디널리티가 해당 열의 고유 값 수라는 것입니다. 기본 키 열 (예 : table.id)의 카디널리티를보고있는 경우 해당 열의 카디널리티는 테이블의 각 행에 대해 하나의 고유 ID가 있으므로 해당 테이블에 포함 된 행 수를 알려줍니다. 테이블에있는 행 수를 확인하기 위해 해당 테이블에서 "COUNT (*)"를 수행 할 필요가 없습니다. 단순히 카디널리티 만 확인하면됩니다.


4

간단히 말해서 카디널리티는 테이블 내의 행 또는 튜플의 수입니다. 열 수를 "정도"라고합니다.


4

로부터 수동 :

카디널리티

인덱스의 고유 값 수에 대한 추정치입니다. ANALYZE TABLE 또는 myisamchk -a를 실행하여 업데이트됩니다. 카디널리티는 정수로 저장된 통계를 기반으로 계산되므로 작은 테이블에서도 값이 반드시 정확하지는 않습니다. 카디널리티가 높을수록 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 2017-04-09

1
이제 소스를 명확하게 말하고 형식이 더 좋습니다.
칼라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.