프로그래밍/Database

[Database] 카디널리티의 개념과 인덱스 정리

프로그래민구찌 2021. 5. 21. 15:45

1. 카디널리티(cardinality)란?

- 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표

 

중복도가 '낮으면' 카디널리티가 '높다'고 표현하고, 

중복도가 '높으면' 카디널리티가 '낮다'고 표현한다.

 

예를들어)

- 성별, 학년 등은 카디널리티가 낮다고 얘기합니다.

- 반대로 주민등록번호, 계좌번호 등은 카디널리티가 높다고 얘기합니다.

 

- 만약 성별을 인덱스로 잡는다면, 남/녀 중 하나를 선택하기 때문에 인덱스를 통해 50%밖에 걸러내지 못합니다.

하지만 주민등록번호나 계좌번호 같은 경우엔 인덱스를 통해 데이터의 대부분을 걸러내기 때문에 빠르게 검색 가능

 

 

2. 테스트

-- 인덱스 테스트할 테이블 생성
CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) not null,
  `location` varchar(10) not null,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select * from users;

-- 임의의 데이터값 넣기
insert into users(name, location) values('lee', 'seoul');
insert into users(name, location) values('park', 'pusan');
insert into users(name, location) values('choi', 'seoul');
insert into users(name, location) values('park', 'seoul');
insert into users(name, location) values('kim', 'seoul');
insert into users(name, location) values('bae', 'incheon');
insert into users(name, location) values('ahn', 'seoul');
insert into users(name, location) values('lee', 'seoul');
insert into users(name, location) values('lee', 'seoul');
insert into users(name, location) values('kim', 'seoul');


-- users 테이블에 인덱스 생성
-- 카디널리티가 높은순 -> 낮은순의 컬럼으로 구성한 인덱스
CREATE INDEX idx_localtion_first ON users(location, name, id);
-- 카디널리티가 낮은순 -> 높은순의 컬럼으로 구성한 인덱스
CREATE INDEX idx_id_first ON users(id, name, location);


SELECT    *
FROM      users
use index (idx_localtion_first);

-- 2개의 인덱스 차이비교 

SELECT    *
FROM      users
use index (idx_id_first);

 

-- 각 칼럼의 카디널리티
select count(distinct(id)) id, 
count(distinct(name)) name, 
count(distinct(location)) location
from users;

-- users 테이블의 컬럼간 distinct 값의 차이를 보자면 id(10건) > name(6건) > location(3건) 이다
-- 즉, distinct 값이 많으면 중복도가 낮다 = 카디널리티가 높다고 생각해도 된다.

 

- 데이터의 갯수가 작아서 인덱스를 왜 사용하나 할수도 있지만 수백만 개의 데이터에 대한 인덱싱에서는 현저한 성능차이를 보입니다.

- 따라서 인덱싱 컬럼을 선택시, 카디널리티에 대한 고려는 중요한 부분이라고 할 수 있습니다.

 

 

3. 결론

- 위의 테스트에서는 성능비교가 나타나지 않지만

- 여러 컬럼으로 인덱스를 잡는다면 카디널리티가 높은순에서 낮은순으로(location, name, id) 구성하는게 더 성능이 뛰어납니다

 

 


- 블로그를 보며 공부중인데 정리하면서도 DB에 대해 너무 무지하기에 공부의 필요성을 느낀다.

 

참조 : https://jojoldu.tistory.com/243

https://itholic.github.io/database-cardinality/