개발머해니

[DB] 인덱스는 어떤 기준으로 잡는 게 좋을까? 본문

백엔드

[DB] 인덱스는 어떤 기준으로 잡는 게 좋을까?

왕행님 2023. 8. 27. 17:57
728x90
반응형

안녕하세요!

실무환경에서는 조회 속도 향상을 위해 PK로 잡혀있지 않은 컬럼에 INDEX를 걸어둔 것을 많이 볼 수 있는대요~ 과연 인덱스는 어떤 기준에 따라 사용하는 것이 알맞을지 한 번 알아보도록 하겠습니다!

 


 

인덱스를 결정하는 기준은?

인덱스를 결정할 때에는 인덱스를 통해 읽어들이는 레코드 수가 얼마나 되는지를 고려해야합니다.

 

총 10만건의 데이터가 존재하는 경우, 특정 인덱스를 활용한다면 5만건의 데이터가 조회된다고 가정해봅시다. 이러한 인덱스는 10만건의 데이터를 전체 스캔하는 경우와 비교했을때 크게 성능이 향상된 것이라 볼 수 있을까요? 대답은 '아니다!' 입니다. 굳이 인덱스를 걸지 않아도 Table Full Scan로 조회하는 것이 더 이득일 수 있기 때문입니다. 

 

따라서, 인덱스를 잡을 때 일반적으로 전체 레코드 갯수의 20% 미만의 레코드만 읽어올 수 있다면 효율적인 인덱스라고 볼 수 있다고 합니다. 

 

이러한 점을 고려해서, 인덱싱 전략으로 크게 아래 네 가지 기준이 있다고 합니다.

① 카디널리티 (Cardinality)가 높은가?
② 선택도 (Selectivity)가 낮은가?
③ 중복도가 낮은가?
④ 활용도가 높은가?

 

자세한 내용은 아래에서 하나씩 차근차근 다뤄보도록 하겠습니다.

 

 

 

카디널리티(Cardinality) : 적당히 높을수록 Good!

카디널리티(Cardinality)란 특정 데이터 집합의 유니크한 값의 개수입니다.

- 만약, 5개의 부서만 존재한다면? 해당 컬럼의 'Cardinality = 5'가 됩니다.
- 성별의 경우에는 '남', '여' 두 가지 값이 존재하기 때문에 'Cardinality = 2'가 됩니다.

 

인덱싱 전략에서 Cardinality가 높은 컬럼에 인덱스를 걸어야 합니다. Cardinality가 낮다면, 읽어야할 레코드의 수가 그만큼 많아지기 때문입니다. 

 

하지만 카디널리티는 데이터의 특성에 따라 상대적인 수치입니다.

만약 직원들의 개인정보가 담겨있는 '직원 테이블(emp_tbl)'이 있다고 가정해봅시다. 

- '직원번호'는 중복값이 존재하지 않기 때문에 Cardinality가 높다고 할 수 있습니다.
- '부서코드'는 중복도가 상대적으로 높기 때문에 '직원번호'에 비해 Cardinality가 낮다고 할 수 있습니다.

 

선택도 (Selectivity) : 적당히 낮을수록 Good!

선택도(Selectivity)는 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표라 볼 수 있습니다. 

자료를 찾아보면, 혹자는 선택도가 높을수록 좋다고 하고, 혹자는 선택도가 낮을수록 좋다고 하는데 과연 무엇이 맞는 걸까요?

선택도 = 카디널리티 / 총 레코드 수 * 100 (%)

 

선택도를 구하는 공식입니다. 카디널리티는 앞에서 알아봤듯 중복되지 않는 유니크한 값의 갯수입니다. 

 

선택도가 100%이라면, [유니크한 값의 갯수 = 총 레코드의 갯수] 라는 뜻입니다. 즉, 테이터 내에 중복되는 값이 1개도 없다는 의미겠죠? 만약 선택도가 100%인 컬럼에 인덱스를 걸게 되면, 읽어들어 올 수 5있는 데이터가 1개 뿐입니다. 이런 데이터는 PK로 잡는게 맞겠죠? 따라서 선택도가 100%인 컬럼은 PK로 잡고, 선택도가 20% 미만이 되는 컬럼을 Index로 잡는 것이 효율적인 것으로 판단됩니다.

 

반면 선택도가 너무 낮으면, 전체 테이블을 Full Scan하는 것과 효율의 차이가 없습니다. 적당히 선택도가 낮은(10~30%) 데이터를 인덱스로 잡아야, 걸러지는 양이 많아져 쓸데없는 데이터를 읽지 않을 수 있어 성능적으로 이득을 볼 수 있습니다.

 

- MAX(선택도) = 100%
- 선택도가 높다 : 한 컬럼이 갖고 있는 값 하나로 적은 레코드가 찾아진다.
- 선택도가 낮다 : 한 컬럼이 갖고 있는 값 하나로 많은 레코드가 찾아진다.

 

중복도

중복도는 카디널리티와 비슷한 개념이기 때문에 간단하게 설명하고 넘어가도록 하겠습니다.

중복도가 낮을수록 인덱스로 설정하기 좋은 컬럼이라고 볼 수 있습니다. 중복도가 낮을수록 조건절에서 찾아지는 레코드가 적기 때문에, 탐색할 범위가 줄어들기 때문입니다.

 

 

활용도

활용도 또한 너무 당연한  개념이기 때문에 설명은 생략하겠습니다. 활용도가 적은 컬럼이라면 굳이 인덱스를 잡아서 물리적 공간을 차지할 필요가 없겠죠?

 

 

 

 

※ 참고 블로그 :

 

카디널리티 VS 선택도 (feat. NDV, Density)

NDV, 선택도, 카디널리티가 헷갈려 글을 정리하게 되었다. 본인이 이해하기 쉽게!<회원>이 회원 테이블을 기준으로 정리할 것이다. 참고로 이 테이블의 PK는 회원번호다.특정 컬럼에 Unique한 값이

velog.io

 

효과적인 DB index 설정하기

인덱스(INDEX)란 검색 속도를 높이기 위한 색인 기술이다. 보통 인덱스는 일반적으로 SELECT 쿼리의 WHERE에 사용할 컬럼에 대해 효율적인 검색을 위해 사용하거나, 다른 테이블과의 JOIN에 사용된다.

velog.io

 

유림's Blog

베짱이가 되고 싶은 개미의 기술 블로그

yurimkoo.github.io

 

카디널리티, 선택도, 인덱스

카디널리티(cardinality)에 대해 알아보자.카디널리티는 DataBase에서 사용되는 용어로 인덱스(index) 전략을 짤 때 한 번씩 언급되는 용어다. 중복도 하곤 반대로

blog.centbin.com

 

728x90
반응형