일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 계정계
- 맥북셋팅
- 컴퓨터공학학사취득
- Homebrew
- 학점은행제
- 의사결정나무모형
- python
- 모놀리식
- MSA
- 학점은행제무료강의
- SQL
- 렌탈스튜디오창업
- oracleapex
- DB
- 오라클
- Pass By Value
- 은행IT
- jdk
- 프로그래머스
- 코어뱅킹
- fastapi
- 디렉토리계층구조
- 개인프로필스튜디오창업
- 코딩테스트
- 맥북환경설정
- union
- 채널계
- jdk17
- it자격증
- 맥북
- Today
- Total
개발머해니
[DB] 인덱스는 어떤 기준으로 잡는 게 좋을까? 본문
안녕하세요!
실무환경에서는 조회 속도 향상을 위해 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%
- 선택도가 높다 : 한 컬럼이 갖고 있는 값 하나로 적은 레코드가 찾아진다.
- 선택도가 낮다 : 한 컬럼이 갖고 있는 값 하나로 많은 레코드가 찾아진다.
중복도
중복도는 카디널리티와 비슷한 개념이기 때문에 간단하게 설명하고 넘어가도록 하겠습니다.
중복도가 낮을수록 인덱스로 설정하기 좋은 컬럼이라고 볼 수 있습니다. 중복도가 낮을수록 조건절에서 찾아지는 레코드가 적기 때문에, 탐색할 범위가 줄어들기 때문입니다.
활용도
활용도 또한 너무 당연한 개념이기 때문에 설명은 생략하겠습니다. 활용도가 적은 컬럼이라면 굳이 인덱스를 잡아서 물리적 공간을 차지할 필요가 없겠죠?
※ 참고 블로그 :
'백엔드' 카테고리의 다른 글
[DB] 오라클에 이모지(Emoji)를 저장할 수 있을까? (0) | 2023.08.31 |
---|---|
[스프링] 클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까? (0) | 2023.08.30 |
[스프링] 예외처리 종류과 효과적인 사용 방법 (0) | 2023.08.29 |
[DB] 파티션의 개념, 필요성, 종류 (0) | 2023.08.27 |
[DB] DML을 하면 무조건 인덱스의 성능저하를 가져올까? (0) | 2023.08.26 |