2022/01/27 : 카디널리티

Extreme Coding·2022년 1월 27일
0

카디널리티

오늘은 정리용 일기를 써야지~!

카디날리티란? 관계 데이터베이스에서 하나의 릴레이션을 구성하는 튜플의 개수, 또는 하나의 데이터 타입으로 정의되는 데이터 레코드의 개수를 의미한다.

카디날리티가 높다 == 중복도가 낮다. (주민번호) 고유 (세기 싫음 *개)
카디날리티가 낮다 == 중복도가 높다. (성별, 나라) (세기 좋음 2개)

-- 중복된 개수가 적거나 없다. 카디날리티가 높다고 표현, 중복도가 낮음
SELECT COUNT(DISTINCT 주민등록번호) FROM 대한민국; 
-- 중복된 개수가 많다. 카디널리티가 낮다고 표현, 중복도가 높음
SELECT COUNT(DISTINCT 성별) FROM 대한민국; 

데이터베이스 테이블의 인덱스를 걸 때, 내가 원하는 데이터를 선택하는 과정에서 최대한 많은 데이터가 걸러져야 성능이 좋음으로! 복합 인덱스 카디널리티가 높은 컬럼을 우선순위로 두는 것이 인덱싱하는 전략이다.

인덱스의 종류는 클러스터 인덱스, 논클러스터 인덱스, 인덱스, 복합 인덱스, 커버드 인덱스 종류가 있다.

클러스터 인덱스

테이블당 1개만 허용되며, 해당 컬럼을 기준으로 테이블이 물리적으로 정렬된다. 테이블이 물리적으로 정렬되기 때문에, 리프노드가 필요없게 되며 추가적인 공간이 필요치 않습니다.
PK 설정 시 자동으로 생성되며, 이 컬럼은 데이터 변경시 항상 정렬을 유지합니다.
조회성 쿼리 성능은 빠르나, 데이터 변경 작업이 일어날 때 프라이머리 키 관련 작업을 추가적으로 해야하므로 성능이 떨어진다.
클러스터 인덱스를 생성하게 되면, 모든 보조 인덱스가 프라이머리 키를 포함하게 됩니다. 따라서, PK 키의 크기가 커질수록 보조 인덱스의 크기도 커지게 됩니다.

논클러스터 인덱스(단일, 복합, 커버드)

테이블당 249개 까지 생성이 가능하며, 테이블의 페이지를 정렬하지 않고, 새로운 공간을 할당합니다. 따라서 클러스터 인덱스보다 많은 공간을 차지하게 됩니다.

단일 인덱스

인덱스에 컬럼이 하나만 걸려 잇는 경우입니다.
데이터가 많지 않으며 조건에 걸리는 컬럼이 적은 경우에 사용합니다.

복합 인덱스

인덱스에 컬럼이 두개 이상이 걸려 있는 경우입니다.
데이터가 많고 조건에 걸리는 컬럼들이 많은 경우에 사용됩니다.

(클러스터 인덱스는 테이블을 물리적으로 정렬하여 실 곤간 사용량이 증가하지 않지만,
복합 인덱스는 테이블 데이터를 기준으로 새로운 인덱스 공간을 생성 및 데이터를 정렬하기 때문에 공간 사용량이 증가하게 됩니다.)

커버드 인덱스

커버드 쿼리라고도 합니다.
쿼리가 인덱스 접근으로 인해 테이블 접근이 필요치 않은 경우입니다.

로그성 테이블도 PK가 필요한가?

네! 만들어야 합니다.
log 테이블은 시간을 기준으로 찾는 조건이 많으므로 시간과 id를 복합 pk를 가지는 것이 좋습니다.

CREATE TABLE daily_log (
    log_date datetime(0) NOT NULL,
    log_id bigint UNSIGNED NOT NULL AUTO_INCREMENT,
    log_content json NOT NULL,
    PRIMARY KEY (log_date, log_id),
    INDEX `nix-daily_log-log_id` (log_id)
) ENGINE=InnoDB

auto_increment 속성을 복합키로 사용할 경우, 첫번째 컬럼이 아니라면 에러가 발생하기 때문에 INDEX nix-daily_log-log_id (log_id) 인덱스 처리로 문제를 해결하면 됩니다.

profile
나의 개발 일기장!

0개의 댓글