서론
학교 백엔드 CS 스터디 중 카디널리티라는 키워드가 나왔습니다.
설명 들었을 때 처음듣는데 중요하다고 생각되어 조사해보고 정리해본 후, 개발했던 프로젝트 리팩토링을 진행하였습니다.
카디널리티(cardinality)이란?
우리 레코드를 조회할 때 인덱스를 정의합니다. 인덱스를 정의할 때 우리는 카디널리티가 높은 것을 사용합니다.
카디널리티란? 해당 컬럼의 중복된 수치를 말합니다.
"성별, 학년, 국적 등은 카디널리티가 낮다"라고 말하며,
반대로 "학번, 주민등록번호 등은 카디널리티가 높다"라고 말합니다.
우리가 성별, 학년같은걸 인덱스로 잡진 않죠?
그렇다면 복합키(여러 컬럼을 인덱스로 구성)를 사용한다면 어떻게 될까요?
우선, 복합키의 예시를 가져와보겠습니다.
위 이미지의 user-auths
테이블을 보면, user_id, auth_vendor_name, username이 존재합니다.
이런식으로 복합키가 존재할 때,
카디널리티가 낮은순으로 정렬하는게 좋을까요?
카디널리티가 높은순으로 정렬하는게 좋을까요?
정답은, 카디널리티가 높은것부터 낮은 순으로 구성(username, user_id, auth_vendor_name)
하는게 좋습니다.
실험 게시글
example datas:
username (중복률 낮음) | user_id (중복률 중간) | auth_vendor_name (중복률 높음) |
1번 유저 카카오 ID | 1번 유저 | "카카오" |
1번 유저 네이버 ID | 1번 유저 | "네이버" |
2번 유저 카카오 ID | 2번 유저 | "카카오" |
직접 테스트도 해보고싶네요.
이부분은 조사해보고 직접 부하테스트를 해볼 수 있는 환경을 갖춰보려고 합니다.
다음에 글로 정리해볼게요!
이 이유는 인덱스의 구성방식에 있습니다.
우리가 데이터베이스에 컬럼을 삽입하면 기본값인 B-TREE방식으로 작동합니다.
이 B-TREE는 데이터를 일정하게 정렬하고, 나누는 특징을 가지고 있습니다.
데이터가 나뉘기 때문에 B-TREE의 Depth가 얕습니다.(대부분 3Depth).
그래서 데이터를 조회하는 성능이 좋습니다.
그렇기 때문에 범위를 크게 줄일수 있는 것부터 탐색하는 것이 효율적이에요.
레퍼런스
'트러블 슈팅' 카테고리의 다른 글
돈이 없는데 서버의 하드디스크가 꽉찼다. (docker chromium) (0) | 2023.06.04 |
---|---|
Refresh Token을 사용하는 이유(Feat. Redis) (0) | 2023.04.07 |
팀원이 설정한 알람이 내 폰에서 울려야한다. (0) | 2023.03.28 |
어떨 때 composite key를 사용해야 할까? (0) | 2023.03.19 |
OAuth 로그인을 하는데 새로운 계정이 생성되면 안된다. (0) | 2023.02.23 |
글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com