인프런 커뮤니티 질문&답변

alopp님의 프로필 이미지
alopp

작성한 질문수

기출로 대비하는 개발자 전공면접 [CS 완전정복]

Q. index를 어느 column에 사용하는 것이 좋을까요? (외 3문제)

인덱스 카디널리티 부분 질문이있습니다.

작성

·

1K

2

꼬꼬무에서 true 또는 false값을 갖는 컬럼 비울 1 : 99 로 예를 들어주셨는데요.

 

비율과는 관계없이 true / false 두종류로만 나눠질때 카디널리티가 매우 낮고 선택도가 매우 높다는 부분이 잘 이해가 안가서 질문드려봅니다.

 

카디널리티 가 2 라서 (트루, 폴스) 카디널리티가 낮고 중복도는 높다 라고 이해를했는데

 

선택도부분은 총 레코드수가 2 이고 카디널리티도 2 이기때문에 선택도는 100%라고 볼수있고 이로인해서 선택도가 굉장히 높기때문에 거의 풀스캔과 맞먹는다고 볼수있어 인덱스를 생성하는것이 좋지 않다.

 

라고 이해하는게 맞을까요?

이게 지금 제가 맞게 이해를 하고있는건지 혼란스러워서 질문드려봅니다.

답변 2

0

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

선택도와 카디널리티에 대해서 많이들 혼란스러워하는 개념인데요. 해당 질문이 이해를 하는 데 도움이 될 것 같아서 가져왔습니다.

👉디스코드 질문 링크

양모시기님:

선생님 카디널리티와 선택도 차이가 헷갈려서 찾아보다가 더 헷갈리게 되어서 질문 드리게 되었습니다.

개념적인 차이가 궁금해서 찾아보다보니 여기저기 써있는 선택도 공식이 다 달라서요.. 정말 많이 찾아봤는데 어느쪽이 더 신뢰가 간다고 할 수 없을만큼 결과가 비등하게 나오네요 ㅜ 아래 두가지로 나뉘는데

  1. 선택도와 카디널리티가 비례한다 ( 선택도 = 카디널리티 / 전체 로우 수)

  2. 선택도와 카디널리티가 반비례한다 ( 선택도 = 선택값 로우 수/ 전체 로우 수 )

제가 걱정되는 부분은 면접 때 인덱스 설정 시 선택도가 낮은 게 좋은 거라고 당당하게 말해도 되는 건지 궁금합니다. 둘 다 결과적인 개념은 같은데 같은 용어를 다른 공식으로 계산해서 쓰고 있으니 혼선이 있을까 걱정이 되네요, 혹시 선생님은 어떻게 생각하시나요?

저의 답변:

일단 위의 expertoracle 에 작성된 아티클만 참고하여 설명드릴게요(왜냐면 해당 아티클 작성자의 이력이 신뢰도가 ㄷㄷ)

일단 비례, 반비례 용어를 쓰는 시점부터 혼란이 시작됩니다. 공식을 보면 [ 선택도 = 카디널리티 / 전체로우수] 이기 때문에 둘의 관계는 비례관계가 맞긴 합니다. 하지만, 인덱스 설정시 선택도가 낮은게 좋고, 카디널리티는 높은게 좋다니... 비례관계인 선택도와 카디널리티가 도대체 어떻게 하나는 낮아지는 동시에 하나는 높아질 수 있을까요?

바로 전체 로우수 덕분에 가능합니다.

예시를 들어볼게요. 만약에 개발자 유저들의 정보를 데이터베이스에 저장했다고 해볼게요. 한 칼럼의 이름은 "주력언어"에요. JAVA, JS, C++, Python, swift 등등 10개의 언어 종류가 있다고 하면 카디널리티는 10이죠. 물론 상황마다 다르겠지만 카디널리티는 잘 변하지 않아요. 이 상황에서 전체 로우수가 50이면 선택도와 카디널리티는 다음과 같을거에요

선택도 : 0.2 (10 / 50)

카디널리티 : 10

여기서 개발자 정보가 많이 들어와서 전체 로우수가 100이 됐어요.

선택도 : 0.1 (10/100)

카디널리티 : 10

이러면 인덱스를 쓸맛이 좀 나겠네요. 선택도가 낮아졌으니까요! 그러다가 새로운 언어가 계속 추가 됐어요. 그래서 카디널리티가 10 -> 30으로 증가했습니다.

선택도 0.3 (30/100)

카디널리티: 30

오 카디널리티가 증가했으니까 인덱스를 쓸맛이 나겠네요! 하지만 선택도가 같이 올라서 이건 좀 맛 없네요 ㅜ 이런 상황에서 전체 로우수가 계속 증가했어요. 100 -> 1000

선택도 0.03 (30/1000)

카디널리티: 30

이러면 또 인덱스 쓸 맛이 나겠네요

이런 식으로 비례관계이긴 하나, 전체로우수 덕분에 카디널리티는 높아지면서도 선택도는 낮아질 수 있어요. 그래서 반비례라고 오해를 하기도 하는 것 같습니다.

결론:

  1. 비례관계는 맞다. 선택도 = 카디널리티 / 전체로우수

  2. 선택도가 낮은게 좋은 거라고 당당히 말해도 된다.

오류: 선택도와 카디널리티는 반비례한다( X )

 

 

참고자료: https://expertoracle.com/2017/11/15/db-tuning-basics-1-selectivity-and-cardinality/

 

 

0

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

안녕하세요 roof tbch님.

제가 다시 확인해보니, 저의 예시에 부족한 부분이 있어서 혼동이 오신 것 같습니다.

true 또는 false값을 갖는 컬럼 비울 1 : 99의 예시에서 "카디널리티가 낮아서 인덱스를 생성하는게 좋지 않다" 가 맞습니다.

선택도는 Table에 저장되어있는 record 갯수와 관련이 있는데, 해당 예시문제에서는 record 수는 언급이 없었으니 알 수 없는게 맞습니다.

 

roof tbch님께서 제대로 이해하신게 맞습니다. 해당 예시를 조금 수정 보안해서 교재에 추가하도록 하겠습니다 :)

감사합니다!! 또 궁금하신점 있으시면 물어봐주세요

alopp님의 프로필 이미지
alopp

작성한 질문수

질문하기