it-source

MySQL의 카디널리티란?

criticalcode 2022. 12. 19. 21:22
반응형

MySQL의 카디널리티란?

MySQL의 카디널리티란?기술 이외의 간단한 언어로 설명해 주세요.

다음과 같이 합니다.group_id럼럼그 게게? ???

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

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

일부 열은 모든 행에 동일한 값을 입력할 수 없도록 하는 제약 조건이 있기 때문에 높은 카디널리티 열이라고 합니다.

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

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

SQL(Structured Query Language)에서 카디널리티라는 용어는 데이터베이스 테이블의 특정 열(속성)에 포함된 데이터 값의 고유성을 의미합니다.카디널리티가 낮을수록 열에서 중복되는 요소가 많아집니다.따라서 카디널리티가 가장 낮은 열은 모든 행에 대해 동일한 값을 가집니다.SQL 데이터베이스는 카디널리티를 사용하여 지정된 쿼리에 대한 최적의 쿼리 계획을 결정하는 데 도움이 됩니다.

이 값은 지수의 고유 값 수에 대한 추정치입니다.

프라이머리 키컬럼이 1개 있는 테이블의 경우 보통 카디널리티는 테이블 내의 행 수와 같아야 합니다.

상세 정보

기본적으로 Kami가 링크한 Wikipedia 기사에 따르면 컬럼 값의 고유성과 관련이 있습니다.

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

카디널리티가 높을수록 행의 구별이 우수합니다.차별화를 통해 데이터를 얻기 위해 더 적은 지점을 탐색할 수 있습니다.

따라서 코디널리티 값이 클수록 다음과 같은 의미가 있습니다.

  • 읽기/쓰기 성능 향상
  • 데이터베이스 크기 확대
  • 숨겨진 인덱스 데이터가 업데이트되고 있기 때문에 쓰기 지연의 성능이 저하됩니다.

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

집합 "A"가 A={1,2,3}이라고 가정하면, 집합의 카디널리티는 |3|이다.

세트 "A"가 5개의 값 A={10,21,33,42,57}을 포함하는 경우 카디널리티는 |5|입니다.

SET     VALUES           Cardinality
A       1,2,3                 3
B       10,21,33,42,57        5

MySQL에서 이는 테이블 열의 카디널리티가 해당 열의 고유한 값의 개수라는 것을 의미합니다.프라이머리 키열(table.id 등)의 카디널리티를 보고 있는 경우 테이블 내의 각 행에 고유 ID가1개 존재하기 때문에 해당 컬럼의 카디널리티에 따라 해당 테이블의 행 수가 표시됩니다.이 테이블에서 "카운트(*)"를 실행하지 않아도 행 수가 몇 개인지 알 수 있습니다.가디널리티만 보면 됩니다.

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

매뉴얼:

카디널리티

인덱스의 고유 값 수에 대한 추정치입니다.이것은 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)

언급URL : https://stackoverflow.com/questions/2566211/what-is-cardinality-in-mysql

반응형