프로그래밍/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/