카디널리티(Cardinality) 개념, 정의
오늘 팀장님에게 sql 작성할때 where에 PK컬럼뿐만 아니라 다른 컬럼을 추가로 조건을 걸면 조회성능에 더 좋은지 문의드렸다.
PK컬럼은 항상 우선순위로 검색이 되기에 이외 컬럼을 추가한다고해서 조회성능이 좋아지지않는다고 알려주셨다. 그리고 카디널리티 개념을 알려주셨다.
카디널리티 개념이 흥미로워서 정리해보았다.
정의
카디널리티(Cardinality)는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.
- 중복도가 낮으면 카디널리티가 높다 e.g. 휴대전화번호, 주민등록번호
- 중복도가 높으면 카디널리티가 낮다 e.g. 이름(동명이인)
여기서 중요한 개념은 카디널리티는 상대적이라는 것이다. 카디널리티는 데이터에 따라 상대적이기때문에 개발DB에서는 카디널리티가 낮아도 운영DB에서는 카디널리티가 높을 수 있다.
활용
DB에서 인덱스를 걸 때 최대한 많은 데이터가 걸러져야 성능이 좋다.
인덱스로 선택된 데이터가 많을수록 full scan이 되므로 성능이 좋지않다.
즉, 여러 컬럼을 동시에 인덱싱할때는 카디널리티가 높은 컬럼을(중복이 적은 컬럼을) 우선순위로 두는 것이 인덱싱 전략에 유리하다.
다만, 인덱스 키를 많이 사용하게 되면 공간 효울이 낮아지게 된다.
공간효율이 무엇일까?
여기서 인덱스(index)란 DB테이블의 검색속도를 향상시키기위한 자료구조로 책 뒤편의 단어와 쪽수를 기재한 색인과 비슷하다.
색인이 책에서 어느정도 비중을 차지할 수 있듯 인덱스를 관리하기 위해선 DB의 약 10%에 해당하는 저장공간이 필요하다.
따라서, 인덱스키를 많이 걸수록 공간효율이 좋지않다.
참고
- 팀장님 지식
- https://soft.plusblog.co.kr/87#:~:text=%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0(Cardinality)%EB%8A%94%20%ED%8A%B9%EC%A0%95%20%EB%8D%B0%EC%9D%B4%ED%84%B0,%EA%B2%BD%EC%9A%B0%20%EC%B9%B4%EB%94%94%EB%84%90%EB%A6%AC%ED%8B%B0%EB%8A%94%202%EB%8B%A4.
- https://itholic.github.io/database-cardinality/